2012-02-20 1 views
2

보통 Java에 관해서 질문 할 필요는 없지만, 지금 뭔가 이상하게 붙어 있습니다. 그리고 나는 계속해서 뭔가를 놓치고 있다고 생각합니다.자바 변경 메뉴에서보기가 작동하지 않습니다.

JMenuBar가있는 JFrame 응용 프로그램이 있습니다. 메뉴 표시 줄의 항목에는 ActionManager라는 클래스 인 PageManager가 있습니다. 디버그는이 모든 것이 잘 작동 함을 보여줍니다. 전체 많은 같이 초기화 :

하는 UI 클래스에서
public static void main(String[] args) { 
    UI ui = new UI();      //The JFrame 
    PageManager pm = new PageManager(ui); //Menu ActionListener 
    MenuBar mb = new MenuBar(pm);   //MenuBar 
    ui.setJMenuBar(mb); 
    ui.setDefaultCloseOperation(0); 
    ui.setVisible(true); 
    ui.setPage(new Home().getPanel());  //a View 
} 

, 나는 다음과 같은 방법이 있습니다

public void setPage(JPanel p) { 
    System.out.println("Set page"); 
    this.remove(page); 
    System.out.println("Removed"); 
    this.add(p); 
    System.out.println("Added " + p); 
} 

ui.setPage(new Home().getPanel()); 메소드 호출 잘 작동합니다. PageManager의 생성자로 옮기면 역시 작동합니다. 내가 ui.setPage(new Preferences().getPanel());으로 바꿔도 작동합니다. Home 및 Preferences 클래스는 JPanel을 작성해 getPanel 메소드를 사용해 돌려주는 View입니다.

그러나 actionListener를 사용하여 페이지를 변경하는 것이 효과가없는 것으로 보입니다. 모든 System.out.println 행은 잘 인쇄되지만 페이지는 변경되지 않습니다. PageManager에서 이것을 사용합니다 :

(ActionListener는 이벤트를 선택하고 소스를 확인한 다음 changePage를 호출합니다).

모든 것이 실행되고 콘솔 출력에 따라 정상적으로 작동하는 것처럼 보이지만 페이지는 내가 수정 한 내용 (예 : 작은 수정 포함)을 변경하지 않습니다.

어떤 도움이 크게 appreceated 것입니다!

종류와 관련,

+0

내가 첨부했던 샘플 프로그램을 점검하고 revalidate() 및 repaint()를 주석에 넣으려고하면 변경 사항이 표시되지 않지만 주석을 제거하지 않으면 해당 JFrame에서 변경 사항이 실현됩니다 . –

답변

4

일반적으로 이러한 동작을 수행하는 데 더 쉬운 방법은 CardLayout을 사용하는 것입니다.

또한 새로운 패널을 기존의 JFrame에 추가 한 후에는 이전 패널을 제거하여 revalidate()repaint()으로 시도하여 새로운 추가 기능을 구현할 수 있습니다. 당신의 JDK가 다음 프레임 늘 '일에 재 검증 아래 1.6의 경우

, 대신의 JMenuBar가 추가로 여기에

revalidate() on JFrame is directly used with JDK 7+ 

frameObject.getRootPane().revalidate();, 당신의 원인을 돕기 위해 하나 개의 샘플 코드이다 사용

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

public class FrameTest extends JFrame 
{ 
    public FrameTest() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationByPlatform(true);   

     final JPanel panel1 = new JPanel(); 
     panel1.setBackground(Color.BLUE); 
     final JPanel panel2 = new JPanel(); 
     panel2.setBackground(Color.DARK_GRAY); 

     JMenuBar menuBar = new JMenuBar(); 

     JMenu menu1 = new JMenu("MENU 1"); 
     JMenu menu2 = new JMenu("MENU 2"); 
     JMenu menu3 = new JMenu("MENU 3"); 


     JMenuItem menuItem1 = new JMenuItem("CHANGE PANELS");  
     JMenuItem menuItem2 = new JMenuItem("MENU ITEM 2"); 
     JMenuItem menuItem3 = new JMenuItem("MENU ITEM 3"); 
     menuItem1.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       if (panel1.isShowing()) 
       { 
        remove(panel1); 
        add(panel2, BorderLayout.CENTER); 
       } 
       else if (panel2.isShowing()) 
       { 
        remove(panel2); 
        add(panel1, BorderLayout.CENTER); 
       } 
       // for getRootPane().revalidate(); 
       revalidate(); // For JDK 7+ 
       repaint(); 
      } 
     }); 

     menu1.add(menuItem1); 
     menu2.add(menuItem2); 
     menu3.add(menuItem3); 

     menuBar.add(menu1); 
     menuBar.add(menu2); 
     menuBar.add(menu3); 

     JButton button = new JButton("CHANGE"); 
     button.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       if (panel1.isShowing()) 
       { 
        remove(panel1); 
        add(panel2, BorderLayout.CENTER); 
       } 
       else if (panel2.isShowing()) 
       { 
        remove(panel2); 
        add(panel1, BorderLayout.CENTER); 
       } 
       // for getRootPane().revalidate(); 
       revalidate(); // For JDK 7+ 
       repaint(); 
      } 
     }); 

     add(panel1, BorderLayout.CENTER); 
     add(button, BorderLayout.PAGE_END); 
     setJMenuBar(menuBar); 
     setSize(200, 200); 
     setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new FrameTest(); 
      } 
     }); 
    } 
} 
+0

예, 그렇지만 저는 MenuBar를 사용하고자하는 몇 가지 이유가 있습니다. 그래서 실제로 그걸 사용하려고합니다. JDK 7+를 사용하고 revalidate 및 repaint (모두 add (page); 만 포함 된 paint() 메소드를 배치 했음) 올바른지?) 성공하지 못했습니다. –

+0

MenuBar를 추가해도 문제가되지 않습니다. 그리고 "(add) (page);를 포함하는 페인트 (...) 메소드를 배치했는데, 맞습니까?", paint() 메소드를 사용했던 곳에서,이 컴포넌트의 메소드를 오버라이드하고 있습니까? 당신은 선생님, 영원에 대한 나의 감사를 –

+0

페인트()를 사용하지 않고, paintComponent에 (...) 메소드를 오버라이드 (override)! 을 나는이 내 방법을 변경 : \t 공공 무효 setPage (JPanel의 피) { \t \t System.out에. 에 println ("설정 페이지"); \t \t 제거 (페이지) \t \t 페이지 = P; \t \t 추가 (페이지) \t \t 재 검증();\t \t repaint(); \t} 및 작동 :). 멋진 레슨을 가져 주셔서 감사합니다! –

2

마크 시각적 구성 요소의 구성 요소 계층 구조를 변경하면 변경 사항이 볼 수 있도록하기 위해 hierachy를 확인해야합니다. JavaDoc of the remove() method 참조 :

이 방법은 레이아웃 관련 정보를 변경하므로 구성 요소 계층이 무효화됩니다. 컨테이너가 이미 표시된 경우 변경 사항을 반영하기 위해 계층 구조의 유효성을 검사해야합니다.

+0

+1, 귀하의 답변에 제공된 멋진 정보. –

+0

고마워, 나는 자동으로 제거하고 추가 할 때 일어난다 고 확신했다!그러나 나는 계층 구조를 다시 검증하는 방법을 모릅니다. 그걸 도와 주실 수 있나요? –

관련 문제