为什么 Swing 在进入中心之前移动 window

Why does Swing move window before going center

我正在 Java 使用 Swing 创建一个计算器。我首先制作了一个 window 并为第一个按钮设置了一个按钮。当我 运行 代码时, window 从左上角开始,然后转到中间。我希望 window 出现在中间而不会出现小故障。

此外,有时按钮不会显示,除非我更改 window 的大小。如果那没有发生,那将是有帮助的。感谢您的帮助。

    import javax.swing.*;

    public class Main{

            public Main(){

                    JFrame frame = new JFrame("Calculator");
                    frame.setVisible(true);
                    frame.setSize(300, 500);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLocationRelativeTo(null);

                    JPanel panel = new JPanel();
                    frame.add(panel);

                    JButton num1 = new JButton("1");
                    panel.add(num1);    
            }

            public static void main(String args[]){

                    Main calc1 = new Main();
                    System.out.println("Starting Calculator");

            }

    }

window 的默认位置是 0x0

所以,如果我们看一下您的代码...

JFrame frame = new JFrame("Calculator");
frame.setVisible(true);
frame.setSize(300, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
  • 您创建框架
  • 你让它可见(在 0x0)
  • 你设置它的尺寸
  • 您将它的位置设置为中心

所以,不是 Swing,是你。

作为一般规则,您应该只在完全准备好后才使框架可见,也许更像是...

JFrame frame = new JFrame("Calculator");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel panel = new JPanel();
frame.add(panel);

JButton num1 = new JButton("1");
panel.add(num1);    

frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);

您还应确保您是仅来自事件调度线程上下文的 creating/modifying UI 元素,有关详细信息,请参阅 Initial Threads

例如...

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            Main calc1 = new Main();
        }
    });
}

您正在事件处理线程之外操作 Swing 组件。

改变它,你的大部分奇怪效果都会消失,请参阅 Handling the Event Dispatch Thread 了解更多信息。