我正在开发一个Java应用程序。
我在设置框架并使其可见后添加了一些标签。我还在JPanel
上调用了revalidate()
,我正在上面添加标签。
但是,并非所有标签都返回正确的位置。
这是我的代码。
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]
在此代码中,如果我在更新和打印组件的位置之间添加一些延迟,则所有组件都会返回正确的位置。但是,在我的应用程序中,即使延迟也不起作用!
事实证明,我们必须在根组件上调用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());
}
}
}