2013-04-11 2 views
0

간단한 GUI (이클립스에서 windowbuilder로 생성)를 그리려하고 있는데, 두 개의 단추와 스크롤 가능한 텍스트 영역이 필요합니다. 나는 달성하기 위해 다음 코드를 생성 한 위 :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; 

편집 :

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

코드의 나머지 부분은 이전하지만 모든 I가 표시지고 있어요 내 구성 요소가없는 빈 회색 프레임입니다 (비록 모두가 windowbuilder에 표시되어 있음).

지속적인 도움에 감사드립니다.

+0

샘플은 메인에 표시되지 않지만 다른 프레임이나 대화 상자에 프레임을 추가하고있는 것으로 보입니다. –

+1

관련 없음 : 구성 요소의 수동 크기 조정/위치 지정을 절대하지 마십시오. 대신 적절한 LayoutManager를 사용하십시오. – kleopatra

+0

감사합니다. 내가 물건을 지정하는 내 방식으로 문제가 짐작하면 사용자가 최대화하면 아무 것도 올바르게 그릴 수 없다는 것입니다. 나는 상대적 레이아웃을 얻지 못했고 대신 절대적으로 갔다. – andy

답변

3

콘솔 출력은 여기서 정확히 무엇이 잘못되었는지 설명합니다. 당신이 콘텐츠 창에 panel를 추가 frame.getContentPane().add(panel,"Center"); 라인에서

IllegalArgumentException: adding a window to a container 

하지만 panel 자체가 Main extends JFrame의 인스턴스입니다.

당신은 전혀 외부 프레임에 대한 참조를 제거하고 당신이 또한 addWindowListener 부분을 이동할 수 있습니다

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

같은 것을 메인 코드가 감소 즉, Main 프레임에 윈도우 청취자를 추가해야

내부 클래스 Main.

+0

+1 다시 나를 이겼다 :-) – kleopatra

+0

미안하지만, 나는 따라 잡지 않는다. (나는 자바에 익숙하지 않다.) JFrame 프레임 코드를 모두 Main 섹션으로 옮길 것을 제안합니까? 기회가 있다면 수정 된 Main에 대한 예를 들어 줄 수 있습니까? – andy

+0

@andy 내 편집을 참조하십시오. – Howard