热释光;在不同的dpi设置上,我的应用程序的组件可以重叠。为了消除这个问题,我想检查组件宽度,在更新ui之后,它总是等于0。问题末尾的简单代码。
基本问题是,在不同的dpi设置上,我的程序的不同部分是最右边的部分。在高dpi上是动态生成的标签,在低dpi上是固定宽度的文本字段。
我正在使用springlayout来处理可能更改的dpi设置。与上述我有一个问题,在特定的设置组件重叠。
为了克服这个问题,我想检查一个组件的左边缘是否比另一个组件的右边缘更左+10像素以获得更多的空间。
if (labelRight.getX() < (labellist.get(0).getX() + labellist.get(0).getWidth+10)){
//Use one SpringLayout setting for labelRight
} else //Use another SpringLayout setting for labelRight
我假设问题是在生成组件后检查组件的宽度。用户可以从不同的设置中进行选择,这些设置将更改部分面板内容。 labellist
包含该区域最右边的标签。
我编写了一个小测试程序来显示宽度检查中的问题宽度:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SpringLayout;
import javax.swing.UIManager;
public class testsforSO extends JFrame {
private static final long serialVersionUID = -857761460788731909L;
ArrayList<JLabel> lbls = new ArrayList<>();
int lblCount = 6;
JPanel panel = new JPanel();
SpringLayout sl_panel = new SpringLayout();
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
testsforSO frame = new testsforSO();
frame.pack();
frame.setVisible(true);
frame.setSize(500, 500);
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public testsforSO() {
getContentPane().add(panel);
updateUI();
JButton incr = new JButton("Increment here!");
incr.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
for (int i=0; i<=lbls.size()-1; i++){
panel.remove(lbls.get(i));
}
lblCount++;
lbls.clear();
updateUI();
panel.repaint();
panel.revalidate();
System.out.println("Width of slimest label: " + lbls.get(0).getWidth());
System.out.println("Width of widest label : " + lbls.get(lbls.size()-1).getWidth());
}
});
panel.add(incr);
sl_panel.putConstraint(SpringLayout.NORTH, incr, 10, SpringLayout.NORTH, panel);
sl_panel.putConstraint(SpringLayout.EAST, incr, -10, SpringLayout.EAST, panel);
panel.setLayout(sl_panel);
}
private void updateUI(){
for (int i = 0; i <= lblCount; i++) {
String abc = new String();
for (int j = 0; j <= i; j++) {
abc += "xx";
}
JLabel bfrLbl = new JLabel(abc);
lbls.add(bfrLbl);
panel.add(bfrLbl);
}
for (int i = 0; i <= lbls.size() - 1; i++) {
if (i > 0)
sl_panel.putConstraint(SpringLayout.NORTH, lbls.get(i), 8, SpringLayout.SOUTH, lbls.get(i - 1));
else
sl_panel.putConstraint(SpringLayout.NORTH, lbls.get(i), 8, SpringLayout.NORTH, panel);
}
}
}
当按下按钮时,ui会在底部更新一个标签。相应地安装Spring布局,然后重新验证面板。但是,宽度的输出为0。为什么会这样?我能做些什么?
1条答案
按热度按时间llew8vvj1#
经过进一步调查,我找到了一种正确读取组件宽度的方法:
有办法。与之相比,似乎是一条非常庞大的线
不过。