为什么我必须在每个 PaintComponent 上设置 JLabel 的位置?

我想在一个非常简单的环境中使用 JLabel,但我想知道为什么我必须在每次重绘时设置位置。


代码:


public class Example {

    public static void main(String[] args) {

        JFrame frame = buildFrame();

        TestPane pane = new TestPane();


        frame.add(pane);


        while (true) {

            pane.repaint();

            frame.setVisible(true);

        }

    }


    private static JFrame buildFrame() {

        JFrame frame = new JFrame();

        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        frame.setSize(480, 272);

        frame.setVisible(true);

        return frame;

    }

}


public class TestPane extends JPanel {

    JLabel testLabel = new JLabel("TEST");


    TestPane() {

        super();

        add(testLabel);

        testLabel.setLocation(200, 200);

    }


    @Override

    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

        testLabel.setLocation(200, 200); // without this line, the label will always be at the top center

    }

}

基于循环的布局来自我正在制作的带有图像的各种动画。为什么重绘总是重置所有标签的位置,所以我必须在每个 PaintComponent 上设置位置?


MMMHUHU
浏览 77回答 1
1回答

临摹微笑

为什么我必须在每次重画时设置位置。你不知道。实际上,您永远不应该在方法内设置组件的位置或任何类型的约束paintComponent。paintComponent方法仅用于绘画,不用于定向或其他任何用途。当您组件的位置将由容器当前的LayoutManagerjpanel.add(myComponent, constraints)决定。(当您没有任何约束时,将发生默认约束,每个布局管理器都有自己的默认约束)。jpanel.add(myComponent);标签放置在面板的顶部,因为你没有设置面板的布局,所以它有它的默认值,即FlowLayout。为了更改它,您必须使用另一个具有适当约束的布局管理器。例如,为了将其放置在面板的中心,您必须执行以下操作:jpanel.setLayout(new BorderLayout()); jpanel.add(myLabel,BorderLayout.CENTER);最后while(true)在 GUI 运行的线程中执行,它将挂起线程,意味着 GUI 将被“冻结”,因为事件无法发生。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java