简单的gui中java.awt.Container.checkNotAWindow错误

时间:2013-04-11 12:31:09

标签: java swing jframe illegalargumentexception windowbuilder

我正在尝试绘制一个简单的GUI(在eclipse中使用windowbuilder创建),我希望它们之间有2个按钮和一个可滚动的文本区域。我创建了以下代码来实现上述目标:

public class Main extends JFrame implements ActionListener{
    public Font font; //used for the font file
    public JTextArea txtDataWillBe;

     public Main() throws FontFormatException, IOException{
        setTitle("Main title ");

        setBounds(100, 100, 1200, 600);
        getContentPane().setLayout(null);

        txtDataWillBe = new JTextArea();
        txtDataWillBe.setText("Your data will display here");
        txtDataWillBe.setFont(new Font("Droid Sans", Font.BOLD, 18));
        txtDataWillBe.setEditable(false);
        txtDataWillBe.setColumns(1);
        txtDataWillBe.setBounds(0, 40, 919, 484);
        getContentPane().add(txtDataWillBe);

        JButton button = new JButton("CLICK TO OPEN");
        button.setBounds(0, 0, 940, 40);
        button.setFont(new Font("Coalition", Font.PLAIN, 18));
        getContentPane().add(button);

        JButton btnPrint = new JButton("PRINT");
        btnPrint.setBounds(0, 531, 940, 40);
        btnPrint.setFont(new Font("Coalition", Font.PLAIN, 18));
        getContentPane().add(btnPrint);

    }

        private final String JTextFile = null;
        JFileChooser chooser;
        String choosertitle;

        public static File deletefile; 

编辑:

 public static void main(String s[]) {

            JFrame frame = new JFrame("Reader");
            Main panel = null;
            try {
                panel = new Main();
            } catch (FontFormatException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            frame.addWindowListener(
              new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    File deleteme = new File (deletefile + "mx.txt");
                    deleteme.delete();
                  System.exit(0);
                  }
                }
              );
            frame.getContentPane().add(panel,"Center");
            frame.setSize(panel.getPreferredSize());
            frame.setVisible(true);
            }

我最初在JScrollPane中有JTextarea(认为这是获得我想要工作的滚动的最佳方式)。我删除了导致控制台错误的JScrollPane思路,但我仍然收到错误。

控制台输出为:

Exception in thread "main" java.lang.IllegalArgumentException: adding a window to a container
    at java.awt.Container.checkNotAWindow(Container.java:439)
    at java.awt.Container.addImpl(Container.java:1035)
    at java.awt.Container.add(Container.java:923)

编辑:主要在上面添加。

我的GUI出错了什么?
我是否需要JScrollPane和JTextArea来启用已加载文本的垂直滚动?

感谢您的帮助;

安迪

编辑:

我已根据以下建议进行了编辑,因此我的代码现在为:

 public Main() throws FontFormatException, IOException{


        JFrame frame = new JFrame("Reader ");
          frame.addWindowListener(
                  new WindowAdapter() {
                    public void windowClosing(WindowEvent e) {
                        File deleteme = new File (deletefile + "mx.txt");
                        deleteme.delete();
                      System.exit(0);
                      }
                    }
                  );
                frame.getContentPane().add(panel,"Center");
                frame.setSize(getPreferredSize());
                frame.setVisible(true);

其余的代码和以前一样,但我显示的是一个没有任何组件的空白灰框(尽管它们都在windowbuilder中显示)。

感谢您的继续帮助。

1 个答案:

答案 0 :(得分:3)

控制台输出正在准确描述这里的错误。

IllegalArgumentException: adding a window to a container

frame.getContentPane().add(panel,"Center");行中,您将panel添加到内容窗格中,但panel本身就是Main extends JFrame的实例。

你应该删除对外框的任何引用,只需将窗口监听器添加到Main框架,即主代码缩小为类似

JFrame frame = new Main();
frame.addWindowListener( ... );
frame.setVisible(true);

您可能还想在课程addWindowListener内移动Main部分。