Java JFrame按钮逻辑错误
我花了一些时间重新学习java,一个奇怪的逻辑错误击中了我Java JFrame按钮逻辑错误,java,swing,layout,jframe,jbutton,Java,Swing,Layout,Jframe,Jbutton,我花了一些时间重新学习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 J
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)您正试图通过setSize
和setLocation
等使用Absolute
LayoutManager,但未对要添加JButton
的组件调用setLayout(null)
但是,这不是Swing中的最佳实践
添加到JFrame
contentpane时,默认布局是将组件添加到的默认位置
读读
2) 另外,当使用正确的LayoutManager
时,您将省略JFrame#setSize(..)
调用,并在设置JFrame
可见之前将其替换为
3) 也有专门的阅读
它指示通过swingutilities.invokeXXX(..)
block在EDT上创建所有swing组件:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//create and manipulate swing components here
}
});
4) 也可以使用JFrame.setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE)
因为这将允许任何其他线程、计时器等即使在JFrame
被处理后也可以执行。1)您试图通过setSize
和setLocation
等使用Absolute
布局管理器,但不调用setLayout(null)
在要添加JButton的组件上但是,这不是Swing中的最佳实践
添加到JFrame
contentpane时,默认布局是将组件添加到的默认位置
读读
2) 另外,当使用正确的LayoutManager
时,您将省略JFrame#setSize(..)
调用,并在设置JFrame
可见之前将其替换为
3) 也有专门的阅读
它指示通过swingutilities.invokeXXX(..)
block在EDT上创建所有swing组件:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//create and manipulate swing components here
}
});
4) 也可以使用JFrame.setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE)
因为这将允许任何其他线程、计时器等即使在JFrame
被处理后也能继续执行。添加到容器中的组件将在列表中跟踪。列表的顺序将定义组件在容器中的前后堆叠顺序。如果在将组件添加到容器时未指定索引,则会将其添加到列表的末尾(从而添加到堆叠顺序的底部)。在代码中,按钮堆叠在另一个按钮上。这就是为什么会出现此错误(如您所想)。
这将解决您的问题:-
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
}
添加到容器中的组件在列表中进行跟踪。列表的顺序将定义组件在容器中的前后堆叠顺序。如果在将组件添加到容器时未指定索引,则会将其添加到列表的末尾(从而添加到堆叠顺序的底部)。在代码中,按钮堆叠在另一个按钮上。这就是为什么会出现此错误(如您所想)。
这将解决您的问题:-
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
}
加:
要在代码行后添加代码,请执行以下操作:
frame.setSize(400, 500);
加:
要在代码行后添加代码,请执行以下操作:
frame.setSize(400, 500);
只需将面板添加到框架中,并将按钮添加到面板中即可
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
只需将面板添加到框架中,并将按钮添加到面板中即可
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
这不是一个正确的方式,一个适当的布局管理器,而不是绝对的,这取决于你的愿望。他特别想自己确定按钮的大小和位置。他不是在问一个更好的方法来布置它们,他是在问为什么它们的位置和尺寸不正确。我以我认为他想要的方式回答了他的问题。建议其他替代方案是可以的——他会选择他认为有用的信息。如果需要,OP可以通过setXXXSize
或覆盖getXXXSize
手动调整JButton
的大小。当使用符合他需要的LayoutManager
时,大多数LayoutManager会忽略你的setSize()。当使用LM时,你不能指定你想要的东西在哪里-你必须建立它们。再一次,我试图以我认为他想要的方式回答他的问题。如果你有不同的意见-太好了。这就是所谓的。他将选择什么信息解决他的问题。正如您所看到的,我没有指定setSize
方法setXXXSize
或覆盖getXXXSize
即setPreferredSize
、setMamximumSize
和getPreferredSize
等。具体请参见,这不是正确的方法,应根据您的需要使用除绝对布局管理器以外的适当布局管理器。他特别想自己确定按钮的大小和位置。他不是在问一个更好的方法来布置它们,他是在问为什么它们的位置和尺寸不正确。我以我认为他想要的方式回答了他的问题。建议其他替代方案是可以的——他会选择他认为有用的信息。如果需要,OP可以通过setXXXSize
或覆盖getXXXSize
手动调整JButton
的大小。当使用符合他需要的LayoutManager
时,大多数LayoutManager会忽略你的setSize()。当使用LM时,你不能指定你想要的东西在哪里-你必须建立它们。再一次,我试图以我认为他想要的方式回答他的问题。如果你有不同的意见-太好了。这就是所谓的。他将选择什么信息解决他的问题。正如您所看到的,我没有指定setSize
方法setXXXSize
或覆盖getXXXSize
即setPreferredSize
、setMamximumSize
和getPreferredSize
等。具体和绝对参见LayoutMan