我正在开发一个Java应用程序。
我正在添加一些标签后,设置了框架,并使它可见。我还在JPanel上调用了JPanel,并在其上添加了标签。
但是,并非所有的标签都返回正确的位置。
这是我的密码。
public class Test {
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame();
JScrollPane scrollPane = new JScrollPane();
JPanel view = new JPanel();
view.setLayout(new MigLayout());
scrollPane.setViewportView(view);
frame.setContentPane(scrollPane);
frame.setSize(800, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
List<JComponent> labels = update(view);
printLocations(labels);
}
public static List<JComponent> update(JPanel view) {
view.removeAll();
List<JComponent> labels = new ArrayList<>();
for (int i = 0; i < 10; i++) {
JLabel label = new JLabel("Label " + i);
view.add(label);
labels.add(label);
}
view.revalidate();
view.repaint();
return labels;
}
private static void printLocations(List<JComponent> labels) {
for (JComponent label : labels) {
System.out.println(label.getLocation());
}
}
}这是输出:
java.awt.Point[x=7,y=7]
java.awt.Point[x=52,y=7]
java.awt.Point[x=97,y=7]
java.awt.Point[x=0,y=0]
java.awt.Point[x=0,y=0]
java.awt.Point[x=0,y=0]
java.awt.Point[x=0,y=0]
java.awt.Point[x=0,y=0]
java.awt.Point[x=0,y=0]
java.awt.Point[x=0,y=0]在此代码中,如果在更新和打印组件位置之间添加一些延迟,所有组件都会返回正确的位置。但是,在我的申请中,即使是延迟也不起作用!
发布于 2014-11-20 11:08:59
结果,我们必须在根组件上调用revalidate()。然后,这个问题就解决了。
在本例中,根组件是frame。因此,代码如下:
public class Test {
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame();
JScrollPane scrollPane = new JScrollPane();
JPanel view = new JPanel();
view.setLayout(new MigLayout());
scrollPane.setViewportView(view);
frame.setContentPane(scrollPane);
frame.setSize(800, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
List<JComponent> labels = update(view);
frame.revalidate();
printLocations(labels);
}
public static List<JComponent> update(JPanel view) {
view.removeAll();
List<JComponent> labels = new ArrayList<>();
for (int i = 0; i < 10; i++) {
JLabel label = new JLabel("Label " + i);
view.add(label);
labels.add(label);
}
view.repaint();
return labels;
}
private static void printLocations(List<JComponent> labels) {
for (JComponent label : labels) {
System.out.println(label.getLocation());
}
}
}https://stackoverflow.com/questions/27037867
复制相似问题