1

我一直在花一些时间重新学习 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

4 回答 4

4

1)您正在尝试通过等使用LayoutManager Absolute,但没有调用要添加s 的组件。然而,这不是 Swing 中的最佳实践setSizesetLocationsetLayout(null)JButton

添加到JFrame contentpane时,默认布局是BorderLayout将组件添加到的默认位置BorderLayout.CENTER

阅读A Visual Guide to Layout Managers

2)此外,当使用正确时,LayoutManager您将省略call 并在设置可见之前将其JFrame#setSize(..)替换为。JFrame#pack()JFrame

3) 还阅读了 Swing 中的并发性,特别是在Event Dispatch Thread 上,它规定所有 Swing 组件都通过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

于 2013-07-30T17:53:31.657 回答
1

添加:

frame.getContentPane().setLayout(null);

行后的代码:

frame.setSize(400, 500);
于 2013-07-30T17:56:40.513 回答
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                                                                                                         
于 2013-07-30T18:06:33.383 回答
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                                                                                                         
}
于 2013-07-30T17:55:43.127 回答