为什么 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 了解更多信息。
我正在 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 了解更多信息。