将 JLabel 的位置添加到 JPanel



我正在开发一个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());
        }
    }
}

最新更新