Jpanel에서 모든 구성 요소를 제거하는 데 어려움이 있습니다.


1

안녕하십니까,

프로젝트의 주 메뉴를 코딩하고 있습니다. 메뉴가 올바르게 표시됩니다. 메뉴의 3 개의 버튼에 ActionListeners를 설정했습니다.

사용자가 "새 게임 시작"을 선택하면 JPanel을 새로운 라디오 버튼 세트로 재사용하고 싶습니다.

그러나 ActionPerformed를 코딩하여 JPanel에서 기존 구성 요소를 제거하는 것은 저를 곤경에 빠뜨립니다. removeAll이 중요하다는 것을 알고 있지만 불행히도 NetBeans는 ActionPerformed 내에서 mainMenu JPanel 객체로 호출 할 수 없다고 알려줍니다. 그래서 아래 코드에 주석을 달았지만 남겨 두었으므로 내가하려는 것을 볼 수 있습니다.

귀하의 의견이나 제안에 감사드립니다. 여기

public class Main { 

    public static void main(String[] args) { 
     MainMenu menu = new MainMenu(); 
     menu.pack(); 
     menu.setVisible(true); 
    } 
} 

내에는 mainMenu 코드 :

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

    public class MainMenu extends JFrame implements ActionListener { 
     JButton startNewGame = new JButton("Start a New Game"); 
     JButton loadOldGame = new JButton("Load an Old Game"); 
     JButton seeInstructions = new JButton("Instructions"); 

     public MainMenu() { 
      super("RPG Main Menu"); 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      JPanel mainMenu = new JPanel(); 
      mainMenu.setLayout(new FlowLayout()); 
      startNewGame.setMnemonic('n'); 
      loadOldGame.setMnemonic('l'); 
      seeInstructions.setMnemonic('i'); 
      startNewGame.addActionListener(this); 
      loadOldGame.addActionListener(this); 
      seeInstructions.addActionListener(this); 
      mainMenu.add(startNewGame); 
      mainMenu.add(loadOldGame); 
      mainMenu.add(seeInstructions); 
      setContentPane(mainMenu); 

     } 

     public void actionPerformed(ActionEvent evt) { 
      Object source = evt.getSource(); 
      if (source == startNewGame) { 
       //StartNewGame code goes here 
       //mainMenu.removeAll(); 
      } 
      if (source == loadOldGame) { 
       //LoadOldGame code goes here 
      } 
      if (source == seeInstructions) { 
       //Quit code goes here 
      } 
     } 
    } 
1

는 :

public class MainMenu extends JFrame implements ActionListener { 
     JButton startNewGame = new JButton("Start a New Game"); 
     JButton loadOldGame = new JButton("Load an Old Game"); 
     JButton seeInstructions = new JButton("Instructions"); 
     JPanel mainMenu = new JPanel(); 

왜이 개체를 다시 사용의 필요성을 느끼는가?


1

당신은에는 mainMenu의 actionPerformed 사용에 대한 참조가없는이

여기 내 주요 코드입니다. 버튼으로 mainMenu를 선언하면. 그것은 효과가있을 것이다. 당신은에는 mainMenu는 멤버 변수가 될 필요가


0

문제는 actionPerformed 방법은 mainMenu 변수가 actionPerformed 방법에서 보이지 않는, 즉 범위 밖에 있으면 JPanel mainMenu를 호출하려고한다는 것이다.

이 문제를 해결하는 한 가지 방법은 클래스 자체에 JPanel mainMenu 선언을 포함하고 클래스의 모든 인스턴스 메소드에서 액세스 할 수있는 인스턴스 필드로 만드는 것입니다. 예를 들어

:

public class MainMenu extends JFrame implements ActionListener 
{ 
    ... 
    JPanel mainMenu; 

    public MainMenu() 
    { 
     ... 
     mainMenu = new JPanel(); 
     ... 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     ... 
     mainMenu.removeAll(); 
    } 
} 

2

같은 디스플레이 공간을 공유하는 두 개 이상의 구성 요소 (일반적으로 JPanel 인스턴스)를 관리하는 대신 CardLayout을 사용하는 것이 좋습니다. 그렇게하면 런타임에 구성 요소를 추가하고 제거하는 것을 피할 필요가 없습니다.

  0

감사합니다. 나는 CardLayout을 고려할 것이다. 22 feb. 092009-02-22 07:30:11


0

"재사용"을 피하십시오. 컴퓨터는 정리가 잘되어 있습니다. 코드 작성에 집중하십시오.

그래서 패널을 정돈하려고 시도하는 대신 새 패널로 교체하기 만하면됩니다.

일반적으로 청취자를 작성하는 더 좋은 방법은 익명의 내부 클래스입니다. 이것들 내의 코드는 둘러싸는 범위의 변수와 둘러싸는 클래스의 멤버에 액세스 할 수 있습니다. 따라서 mainMenu을 final로 만들고 ActionListener을 익명 내부 클래스로 만들면 코드를 컴파일해야합니다.

또한 클래스를 "다시 사용"하지 마십시오. 각 클래스를 하나의 합리적인 것으로 만들고 구현의 상속을 피하십시오. JFrame을 확장 할 필요가 거의 없으므로 그렇게하지 마십시오.이벤트 원본을 확인하지 않고 각 작업에 대해 ActionListener을 만듭니다.

AWT Event Dispatch Thread에서 항상 Swing 구성 요소를 사용해야합니다. main 메소드를 변경하여 다음과 같은 상용구를 추가하십시오.

public static void main(final String[] args) { 
    java.awt.EventQueue.invokeLater(new Runnable() { public void run() { 
     runEDT(); 
    }}); 
}