java JFrame按钮逻辑错误
我花了一些时间重新学习java,一个奇怪的逻辑错误击中了我
import javax.swing.*;
import java.awt.*;
class Frame
{
public static void main (String args[])
{
JFrame frame = new JFrame("Tester Frame");
frame.setSize(400, 500);
JButton btn1 = new JButton("FOO");
btn1.setSize(150, 50);
btn1.setLocation(45, 0);
JButton btn2 = new JButton("BAR");
btn2.setSize(150, 50);
btn2.setLocation(205, 0);
Container content = frame.getContentPane();
content.setBackground(Color.blue);
content.add(btn1);
content.add(btn2);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}//end main
}
我已经创建了两个JButton对象,它们应该大小相同,位置和文本不同。当然不是这样,“FOO”按钮正是我想要的位置和方式,但“BAR”按钮是整个框架的大小
救命
# 1 楼答案
只需在框架中添加一个面板,并在面板中添加按钮即可
# 2 楼答案
1)您正试图通过
setSize
和setLocation
等方式使用Absolute
LayoutManager,但没有对要添加JButton
的组件调用setLayout(null)
然而,这不是Swing中的最佳实践当添加到} ,将组件添加到^{} 的默认位置
JFrame
contentpane时,默认布局为^{读一下A Visual Guide to Layout Managers
2)同样,当使用正确的}
LayoutManager
时,在设置JFrame
可见之前,可以省略JFrame#setSize(..)
调用,并将其替换为^{3)也要阅读Concurrency in Swing,特别是The Event Dispatch Thread 它指示通过
SwingUtillities.invokeXXX(..)
块在EDT上创建所有swing组件:4)也应该使用
JFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
,因为这将允许任何其他线程、计时器等在JFrame
被释放后继续执行# 3 楼答案
加上:
到行后的代码:
# 4 楼答案
添加到容器中的组件在列表中进行跟踪。列表的顺序将定义组件在容器中的前后堆叠顺序。如果在向容器添加组件时未指定索引,则该组件将被添加到列表的末尾(从而添加到堆叠顺序的底部)。在你的代码中,按钮叠在另一个上面。这就是为什么会出现这个错误(正如你所认为的那样)。 这将解决您的问题:-