2014-03-06 5 views
0

Java GUI에서 "지우기"를 누를 때마다 절대로 작동하지 않습니다. "textPanel"을 다른 버튼으로 바꾸면 "textPanel"과 함께 작동합니다. 당신은 TextPanel의 두 인스턴스, MainFrame에서 하나 FormPanel의 다른 하나가textPanel.setText (""); 작동하지 않거나 표시되지 않습니다

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class MainFrame extends JFrame { 
    private TextPanel textPanel; 
    private FormPanel formpanel; 

    public MainFrame(){ 
     super("My Frame"); 
     createLayout(); 
     createFrame(); 
    } 

    public void createFrame(){ 
     setSize(600, 600); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true);  
    } 

    public void createLayout(){ 
     BorderLayout myLayout = new BorderLayout();  
     setLayout(myLayout); 

     textPanel = new TextPanel(); 
     formpanel = new FormPanel(); 

     // adding components 
     add(textPanel, BorderLayout.CENTER); 
     add(formpanel, BorderLayout.WEST); 
    } 

    public static void main(String[] args){ 
     new MainFrame(); 
    } 

    public static class FormPanel extends JPanel { 

     private JButton clear; 
     private TextPanel textPanel; 

     public FormPanel(){ 
      clear = new JButton("Clear Cart!"); 
      textPanel=new TextPanel(); 
      add(clear); 

      clear.addActionListener(new ActionListener(){ 
       public void actionPerformed(ActionEvent aev){ 
        System.out.println("Test"); 
        textPanel.setText(""); 
       }  
      }); 
      createGrid();    
     } 

     /* this methods simply creates the layout */ 
     void createGrid(){ 
      //creating layout 
      setLayout(new GridBagLayout());  
      GridBagConstraints gc = new GridBagConstraints(); 

      gc.gridy++; 
      gc.weightx = .1; 
      gc.weighty = .1; 
      gc.gridx = 2; 
      gc.gridy=5; 
      gc.anchor = GridBagConstraints.LINE_START; 
      gc.insets = new Insets(0,0,0,0); 

      add(clear, gc); 

     } 
    } 

    public static class TextPanel extends JPanel { 
     private JTextArea textArea; 

     TextPanel(){ 
      textArea = new JTextArea(); 
      setLayout(new BorderLayout()); 

      JScrollPane p = new JScrollPane(textArea); 
      add(p, BorderLayout.CENTER); 
     } 

     public void appendSomeText(String t){ 
      textArea.append(t);  
     } 

     public void setText(String s){ 
      textArea.setText(s); 
     } 
    } 
} 
+2

무엇이 당신의 질문입니까? –

+0

클리어 버튼을 사용하여 텍스트 패널을 실제로 지울 수 있습니까? – user3389471

+2

코드가 너무 길어서이 코드 덤프를 [SSCCE] (http://www.sscce.org/)로 변경하십시오. 아무도이 모든 것을 조사하기를 원하지 않습니다. – turbo

답변

4

:

는 여기에 문제를 보여 내 코드의 경량 버전입니다. FormPanel에 정의 된 TextPanel은 실제로 패널에 추가되지 않으므로 textPanel.setText("");은 표시되지 않으므로 아무런 영향을 미치지 않습니다.

Add To Cart! 단추가 추가 된 텍스트는 textPanel.appendSomeText()을 실행하는 MainFrame - formEventOccurred()의 방법을 실제로 거칩니다. 이것은 TextPanel의 다른 인스턴스이며 MainFrame의 일부이며 실제로 표시됩니다.

복제 된 로직을 메인 프레임에서 패널로 이동해야하는 것처럼 보입니다. 일반적으로 새로운 기능을 추가하지 않으므로 JFrame을 확장하면 안됩니다.

+0

하지만 textPanel = new TextPanel()을 제거하면됩니다. FormPanel에서 내 textPanel.setText ("");에 오류가 발생했습니다. java.lang.NullPointerException – user3389471

+0

라고 말하고 MainFrome에서 제거하면 프로그램이 엉망이되어 단추 나 패널이 표시되지 않습니다. – user3389471

+0

@ user3389471 의심 할 여지없이 프로그램을 리팩토링하고 재구성해야합니다. 지금은 하나의 행에 주석을 달고 작동하게 만들 수는 없습니다. 'MainFrame'을 정리하면 최상위 컨테이너 일뿐입니다. 그것은 당신의 패널을 포함해야하지만 행동 논리는 포함하지 않아야합니다. [작업 사용 방법] (http://docs.oracle.com/javase/tutorial/uiswing/misc/action.html)을 살펴보면 패널 및 도구 모음에서 기능을 분리하여 다시 사용할 수 있습니다. – tenorsax

관련 문제