为什么Swing在前往中心之前移动窗口

时间:2015-11-11 05:55:43

标签: java swing placement

我正在使用Swing在Java中创建一个计算器。我已经开始制作一个窗口并且只有一个按钮用于排名第一。当我运行代码时,窗口从左上角开始,然后到达中心。我希望窗口出现在中心,没有小小的故障。

此外,除非我更改窗口的大小,否则有时按钮不会显示。如果没有发生这将是有益的。谢谢你的帮助。

    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");

            }

    }

2 个答案:

答案 0 :(得分:2)

窗口的默认位置为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);

您还应确保仅在事件调度线程的上下文中创建/修改UI元素,有关详细信息,请参阅Initial Threads

例如......

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

答案 1 :(得分:1)

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

更改此内容并且您的大多数奇怪效果都会消失,请参阅Handling the Event Dispatch Thread以获取更多信息。