2010-05-04 6 views
2

버튼을 클릭 할 때 애플리케이션의 모양과 느낌을 변경할 수있는 스윙 애플리케이션을 개발 중입니다. 이제 내 문제는 버튼을 클릭하여 테마를 변경하면 L & F가 내 앱으로 업데이트됩니다. 이전 테마는 'noire'이고 'MCWin'을 선택했지만 Noire 테마의 스타일은 다음과 같습니다. 아직도 여기왜 모양과 느낌이 제대로 업데이트되지 않습니까?

샘플이 작동 코드 : 문제가 여기에 무엇

package whiteboard; 

    import java.awt.GridBagLayout; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import java.awt.event.ComponentEvent; 
    import java.awt.event.ComponentListener; 
    import javax.swing.JFrame; 
    import javax.swing.JLayeredPane; 
    import javax.swing.JMenu; 
    import javax.swing.JMenuBar; 
    import javax.swing.JMenuItem; 
    import javax.swing.SwingUtilities; 
    import javax.swing.UIManager; 
    import javax.swing.WindowConstants; 



    public class DiscussionBoard extends JFrame implements ComponentListener,ActionListener { 

     // Variables declaration 
     private JMenuItem audioMenuItem; 
     private JMenuItem boardMenuItem; 
     private JMenuItem exitMenuItem; 
     private JMenuItem clientsMenuItem; 
     private JMenuItem acryl; 
     private JMenuItem hifi; 
     private JMenuItem aero; 
     private JMenuItem aluminium; 
     private JMenuItem bernstein; 
     private JMenuItem fast; 
     private JMenuItem graphite; 
     private JMenuItem luna; 
     private JMenuItem mcwin; 

     private JMenuItem noire; 
     private JMenuItem smart; 
     private JMenuBar boardMenuBar; 

     private JMenuItem messengerMenuItem; 
     private JMenu openMenu; 
     private JMenu saveMenu; 
     private JMenu themesMenu; 
     private JMenuItem saveMessengerMenuItem; 
     private JMenuItem saveWhiteboardMenuItem; 
     private JMenu userMenu; 


     JLayeredPane layerpane; 


     /** Creates new form discussionBoard 
     * @param connection */ 
     public DiscussionBoard() 
     {  

      initComponents(); 
      setLocationRelativeTo(null); 
      addComponentListener(this); 

     } 

     private void initComponents() { 

      boardMenuBar = new JMenuBar(); 
      openMenu = new JMenu(); 
      themesMenu = new JMenu(); 
      messengerMenuItem = new JMenuItem(); 
      boardMenuItem = new JMenuItem(); 
      audioMenuItem = new JMenuItem(); 
      saveMenu = new JMenu(); 
      saveMessengerMenuItem = new JMenuItem(); 
      saveWhiteboardMenuItem = new JMenuItem(); 
      userMenu = new JMenu(); 
      clientsMenuItem = new JMenuItem(); 
      exitMenuItem = new JMenuItem(); 

      setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
      setLayout(new GridBagLayout()); 
      setResizable(false); 
      setTitle("Discussion Board"); 

      openMenu.setText("Open"); 
      saveMenu.setText("Save"); 
      themesMenu.setText("Themes"); 
      acryl = new JMenuItem("Acryl"); 
      hifi = new JMenuItem("HiFi"); 
      aero = new JMenuItem("Aero"); 
      aluminium = new JMenuItem("Aluminium"); 
      bernstein = new JMenuItem("Bernstein"); 
      fast = new JMenuItem("Fast"); 
      graphite = new JMenuItem("Graphite"); 
      luna = new JMenuItem("Luna"); 
      mcwin = new JMenuItem("MCwin");  
      noire = new JMenuItem("Noire"); 
      smart = new JMenuItem("Smart"); 


      hifi.addActionListener(this); 
      acryl.addActionListener(this); 
      aero.addActionListener(this); 
      aluminium.addActionListener(this); 
      bernstein.addActionListener(this); 
      fast.addActionListener(this); 
      graphite.addActionListener(this); 
      luna.addActionListener(this); 
      mcwin.addActionListener(this);  
      noire.addActionListener(this); 
      smart.addActionListener(this); 

      messengerMenuItem.setText("Messenger");  
      openMenu.add(messengerMenuItem);   
      openMenu.add(boardMenuItem); 
      audioMenuItem.setText("Audio Messenger"); 
      openMenu.add(audioMenuItem); 
      exitMenuItem.setText("Exit"); 
      exitMenuItem.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent evt) { 
        exitMenuItemActionPerformed(evt); 
       } 
      }); 
      openMenu.add(exitMenuItem); 

      boardMenuBar.add(openMenu);  

      saveMessengerMenuItem.setText("Messenger"); 

      saveMenu.add(saveMessengerMenuItem); 

      saveWhiteboardMenuItem.setText("Whiteboard");  

      saveMenu.add(saveWhiteboardMenuItem); 

      boardMenuBar.add(saveMenu); 

      userMenu.setText("Users"); 
      clientsMenuItem.setText("Current Session"); 

      userMenu.add(clientsMenuItem);  
      themesMenu.add(acryl); 
      themesMenu.add(hifi);  
      themesMenu.add(aero); 
      themesMenu.add(aluminium); 
      themesMenu.add(bernstein); 
      themesMenu.add(fast); 
      themesMenu.add(graphite); 
      themesMenu.add(luna); 
      themesMenu.add(mcwin);  
      themesMenu.add(noire); 
      themesMenu.add(smart); 
      boardMenuBar.add(userMenu); 
      boardMenuBar.add(themesMenu); 
      saveMessengerMenuItem.setEnabled(false); 
      saveWhiteboardMenuItem.setEnabled(false); 

      setJMenuBar(boardMenuBar); 
      setSize(1024, 740);  
      setVisible(true); 
     } 

     protected void exitMenuItemActionPerformed(ActionEvent evt) { 
      System.exit(0);  
     } 
     @Override 
     public void componentHidden(ComponentEvent arg0) { 

     } 

     @Override 
     public void componentMoved(ComponentEvent e) { 

     } 

     @Override 
     public void componentResized(ComponentEvent arg0) { 

     } 

     @Override 
     public void componentShown(ComponentEvent arg0) { 

     } 

     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      try 
      { 

       if(e.getSource()==hifi) 
       { 
         UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
         SwingUtilities.updateComponentTreeUI(getRootPane()); 
         UIManager.setLookAndFeel("com.jtattoo.plaf.hifi.HiFiLookAndFeel"); 
         enableTheme(); 
         hifi.setEnabled(false); 
       } 
       else if(e.getSource()==acryl) 
       { 
        UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.acryl.AcrylLookAndFeel"); 
        enableTheme(); 
        acryl.setEnabled(false); 
       } 
       else if(e.getSource()==aero) 
       { 
        UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.aero.AeroLookAndFeel"); 
        enableTheme(); 
        aero.setEnabled(false); 
       } 
       else if(e.getSource()==aluminium) 
       { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.aluminium.AluminiumLookAndFeel"); 
        enableTheme(); 
        aluminium.setEnabled(false); 
       } 
       else if(e.getSource()==bernstein) 
       { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.bernstein.BernsteinLookAndFeel"); 
        enableTheme(); 
        bernstein.setEnabled(false); 
       } 
       else if(e.getSource()==fast) 
       { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.fast.FastLookAndFeel"); 
        enableTheme(); 
        fast.setEnabled(false); 
       } 
       else if(e.getSource()==graphite) 
       { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.graphite.GraphiteLookAndFeel"); 
        enableTheme(); 
        graphite.setEnabled(false); 
       } 
       else if(e.getSource()==luna) 
       { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.luna.LunaLookAndFeel"); 
        enableTheme(); 
        luna.setEnabled(false); 
       } 
       else if(e.getSource()==mcwin) 
       { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.mcwin.McWinLookAndFeel"); 
        enableTheme(); 
        mcwin.setEnabled(false); 
       } 

       else if(e.getSource()==noire) 
       { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.noire.NoireLookAndFeel"); 
        enableTheme(); 
        noire.setEnabled(false); 
       } 
       else if(e.getSource()==smart) 
       { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.smart.SmartLookAndFeel"); 
        enableTheme(); 
        smart.setEnabled(false); 
       } 
       SwingUtilities.updateComponentTreeUI(getRootPane());  
      } 
      catch (Exception ex) 
      { 
       ex.printStackTrace(); 
      } 
     } 
     private void enableTheme() 
     { 
      acryl.setEnabled(true); 
      hifi.setEnabled(true);  
      aero.setEnabled(true); 
      aluminium.setEnabled(true); 
      bernstein.setEnabled(true); 
      fast.setEnabled(true); 
      graphite.setEnabled(true); 
      luna.setEnabled(true); 
      mcwin.setEnabled(true);  
      noire.setEnabled(true); 
      smart.setEnabled(true); 
     } 

     public static void main(String []ar) 
     { 
      try 
      { 
       UIManager.setLookAndFeel("com.jtattoo.plaf.acryl.AcrylLookAndFeel");    
      } 
      catch (Exception e) 
      {   
       e.printStackTrace(); 
      } 
      new DiscussionBoard(); 
     } 
    } 

? 왜 업데이트되지 않는가?

데모 응용 프로그램 here은 정확히 내가하고 싶은 것을하고 있지만 위선적 인 생각은 없습니다. 죄송합니다

Edit:here 그것이 내가이 원인을 모르겠어요

+0

타사 L & F ('com.jtattoo')를 사용 중입니다. LookAndFeels를 바꿀 때 classpath에 있거나 ClassNotFoundException을 얻고 있습니까? –

+0

미안 피터, 나는 도서관 파일 링크를 지정하는 걸 깜빡 했어. 여기에서 찾을 수 있습니다. http://www.jtattoo.net/downloads/JTattooDemo.jar – swift

+1

단지 참고 사항 : 일반적인 방법을 고려하여 else-if 절을 정리했습니다. 매개 변수는 L & F 이름과 JMenuItem에 대한 상수 일 수 있습니다. –

답변

0

, 라이브러리 파일을 지정하는 잊었지만 당신은 updateUI-method 살펴 있었다? 은 API 문서에서

:

재설정 UI의 현재 모습에서 값을 가진 특성과 느낌.

+0

여기에서 어떤 updateUI 메서드를 사용할 수 있습니까?나는 당신을 붙잡는다. – swift

+0

나는 정확하게 그것이 무엇을하는 것인지 모른다. 방금 API의 설명, 문제 및 코드에서 호출이 누락 된 것을 발견했습니다. – aioobe

0

나는 당신의 예를 시도하고 잘 작동 :

JTattooDemo.jar 
whiteboard/DiscussionBoard.java 
:

alt text http://img401.imageshack.us/img401/3285/so2763157.png


내가 (디렉토리 whiteboardDiscussionBoard.java) 다음 파일에 명령 줄에서 그것을 시도

비 상업적 사용에 대한 에만 무료입니다 617,451,515,는
javac whiteboard/DiscussionBoard.java 
java -cp ".;JTattooDemo.jar" whiteboard/DiscussionBoard 

참고.

+0

그것은 당신에게 어떤 오류라도 보여주지 않을 것이지만 문제는 적절하게 테마를 업데이트하지 않을 것이고, 무작위로 10 개의 테마를 무작위로 선택해보십시오, 그것이 어떻게되어 있는지 보지 않을 것입니다. 다음 링크의 스크린 샷을 참조하십시오 http://www.jtattoo.net/ScreenShots.html – swift

+0

예 : 상업용 앱에 테마를 사용하지 않았습니다. – swift

+0

@swift : 제공된 코드로 L & F를 최소 30 번 변경하려고했습니다. , 모든 것이 예상대로 바뀌는 것 같습니다 (제목 표시 줄, 아이콘 및 메뉴) ... –

1

LnF를 설정 한 호출 후에 SwingUtilities.updateComponentTreeUI(getRootPane()); 호출을 이동하십시오. 전달 된 구성 요소 아래 트리의 모든 구성 요소에서 updateUI을 호출합니다. 지금은 UI를 업데이트 한 다음 UI를 변경하고 있습니다.

관련 문제