我花了一些时间重新学习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
}
我创建了2个JButton对象,它们应该是相同的大小,具有不同的位置和文本。当然不是这种情况,“FOO”按钮正是我想要的地方和方式,但“BAR”按钮是整个框架的大小。
帮助!
答案 0 :(得分:4)
1)您正尝试通过Absolute
和setSize
等方式使用setLocation
LayoutManager,但未在要添加setLayout(null)
的组件上调用JButton
去。 然而,这不是Swing的最佳做法。
添加到JFrame
contentpane 时,默认布局为BorderLayout
,其中组件的默认位置为BorderLayout.CENTER
。
阅读A Visual Guide to Layout Managers
2)同样,当使用正确的LayoutManager
时,您会省略JFrame#setSize(..)
来电,并在设置JFrame
可见之前将其替换为JFrame#pack()
。
3)同时在Concurrency in Swing上专门阅读The Event Dispatch Thread
它通过SwingUtillities.invokeXXX(..)
块在EDT上创建所有摆动组件:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//create and manipulate swing components here
}
});
4)另外使用JFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
因为这将允许任何其他线程计时器等继续执行,即使在JFrame
被处置之后。
答案 1 :(得分:1)
添加:
frame.getContentPane().setLayout(null);
行后的代码:
frame.setSize(400, 500);
答案 2 :(得分:0)
添加到容器的组件将在列表中进行跟踪。列表的顺序将定义组件在容器内的前后堆叠顺序。如果在向容器添加组件时未指定索引,则会将其添加到列表的末尾(因此也会添加到堆叠顺序的底部)。在您的代码中,按钮堆叠在另一个上。这就是为什么您得到这个错误(你认为是这样)。 这将解决您的问题: -
import javax.swing.*;
import java.awt.*;
class OP3
{
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);
JPanel p = new JPanel(new FlowLayout());
p.add(btn1);
p.add(btn2);
frame.add(p);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}//end main
}
答案 3 :(得分:0)
只需在框架中添加一个面板,然后将按钮添加到面板中。
import javax.swing.*;
import java.awt.*;
class source
{
public static void main (String args[])
{
JFrame frame = new JFrame("Tester Frame");
frame.setSize(400, 500);
JPanel panel=new JPanel();//panel added here
panel.setSize(frame.size());
panel.setLocation(0, 0);
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);
panel.add(btn1);
panel.add(btn2);
Container content = frame.getContentPane();
content.setBackground(Color.blue);
content.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}//endmain