Question

I am trying to draw a simple GUI (created with windowbuilder in eclipse), I want to have 2 buttons and a scrollable text area between them. I have created the following code to achieve the above:

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; 

EDIT:

 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);
            }

I originally had the JTextarea inside of a JScrollPane (thinking that was the best way to get the scrolling I want working). I removed the JScrollPane thinking that was causing the console error, but I am still getting the error.

Console output is:

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)

EDIT: Main added above.

What I am doing wrong with my GUI?
Do I need a JScrollPane and JTextArea to enable vertical scrolling of the loaded text?

Thanks for your help;

Andy

EDIT:

I have edited as per the suggestions below so my code now reads:

 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);

The rest of the code is as before but all I am getting displayed is a blank grey frame without any of my components (although they are all showing in windowbuilder).

Thanks for the continued help.

Was it helpful?

Solution

The console output is describing exactly what is wrong here.

IllegalArgumentException: adding a window to a container

In the line frame.getContentPane().add(panel,"Center"); you add panel into your content pane, but panel itself is an instance of Main extends JFrame.

You should remove any reference to the outer frame at all and just add the window listener to the Main frame, i.e. the main code reduces to something like

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

You may also want to move the addWindowListener part inside class Main.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top