2013-04-11 3 views
0

Я пытаюсь нарисовать простой графический интерфейс (созданный с помощью windowbuilder в eclipse), я хочу иметь две кнопки и прокручиваемую область текста между ними. Я создал следующий код для достижения выше:java.awt.Container.checkNotAWindow error in simple gui

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

я первоначально имел JTextArea внутри JScrollPane (мышления, что является наилучшим способом, чтобы получить прокрутки Я хочу работать). Я удалил мышление 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) 

EDIT: Основное добавлен выше.

Что я делаю неправильно с моим графическим интерфейсом?
Нужен ли JScrollPane и JTextArea для вертикальной прокрутки загруженного текста?

Благодарим за помощь;

Энди

EDIT:

я редактировал в соответствии с предложениями ниже мой код теперь гласит:

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

Спасибо за дальнейшую помощь.

+0

Главное не показано в вашем примере, но я подозреваю, что вы добавляете свой кадр в другой фрейм или диалог. –

+1

Несвязанные: не выполняйте ручную калибровку/расположение компонентов, когда-либо. Вместо этого используйте подходящий LayoutManager. – kleopatra

+0

Спасибо. Я предполагаю, что проблема с моим способом определения вещей заключается в том, что если пользователь максимизирует, то ничего не будет правильно рисовать? Я не справился с относительными макетами, поэтому пошел в абсолюты. – andy

ответ

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.

+0

+1 избили меня еще раз :-) – kleopatra

+0

Извините, я не совсем понимаю (я новичок в Java). Является ли предположение, что я перемещаю весь код кадра JFrame в главный раздел? Если у вас есть шанс, вы можете дать мне пример модифицированной Main, которую вы предлагаете? – andy

+0

@andy См. Мое редактирование. – Howard