我想在一个非常简单的环境中使用 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 上设置位置?
1 回答
临摹微笑
TA贡献1982条经验 获得超2个赞
为什么我必须在每次重画时设置位置。
你不知道。实际上,您永远不应该在方法内设置组件的位置或任何类型的约束paintComponent
。paintComponent
方法仅用于绘画,不用于定向或其他任何用途。
当您组件的位置将由容器当前的LayoutManagerjpanel.add(myComponent, constraints)
决定。(当您没有任何约束时,将发生默认约束,每个布局管理器都有自己的默认约束)。jpanel.add(myComponent);
标签放置在面板的顶部,因为你没有设置面板的布局,所以它有它的默认值,即FlowLayout。为了更改它,您必须使用另一个具有适当约束的布局管理器。
例如,为了将其放置在面板的中心,您必须执行以下操作:
jpanel.setLayout(new BorderLayout()); jpanel.add(myLabel,BorderLayout.CENTER);
最后while(true)
在 GUI 运行的线程中执行,它将挂起线程,意味着 GUI 将被“冻结”,因为事件无法发生。
添加回答
举报
0/150
提交
取消