JFrame按钮逻辑错误

时间:2013-07-30 17:49:28

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

帮助!

4 个答案:

答案 0 :(得分:4)

1)您正尝试通过AbsolutesetSize等方式使用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