Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JFrame按钮逻辑错误_Java_Swing_Layout_Jframe_Jbutton - Fatal编程技术网

Java JFrame按钮逻辑错误

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

我花了一些时间重新学习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)您正试图通过
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