有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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”按钮是整个框架的大小

救命


共 (4) 个答案

  1. # 1 楼答案

    只需在框架中添加一个面板,并在面板中添加按钮即可

    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                                                                                                         
    
  2. # 2 楼答案

    1)您正试图通过setSizesetLocation等方式使用AbsoluteLayoutManager,但没有对要添加JButton的组件调用setLayout(null)然而,这不是Swing中的最佳实践

    当添加到JFramecontentpane时,默认布局为^{},将组件添加到^{}的默认位置

    读一下A Visual Guide to Layout Managers

    2)同样,当使用正确的LayoutManager时,在设置JFrame可见之前,可以省略JFrame#setSize(..)调用,并将其替换为^{}

    3)也要阅读Concurrency in Swing,特别是The Event Dispatch Thread 它指示通过SwingUtillities.invokeXXX(..)块在EDT上创建所有swing组件:

    SwingUtilities.invokeLater(new Runnable() {
       @Override
        public void run() {
             //create and manipulate swing components here
        }
    });
    

    4)也应该使用JFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);,因为这将允许任何其他线程、计时器等在JFrame被释放后继续执行

  3. # 3 楼答案

    加上:

    frame.getContentPane().setLayout(null);
    

    到行后的代码:

    frame.setSize(400, 500);
    
  4. # 4 楼答案

    添加到容器中的组件在列表中进行跟踪。列表的顺序将定义组件在容器中的前后堆叠顺序。如果在向容器添加组件时未指定索引,则该组件将被添加到列表的末尾(从而添加到堆叠顺序的底部)。在你的代码中,按钮叠在另一个上面。这就是为什么会出现这个错误(正如你所认为的那样)。 这将解决您的问题:-

    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                                                                                                         
    }