2013-03-04 28 views
2

我最近重寫了很多我的應用程序,而在我這樣做之前,我試圖完成的工作很好。我試圖通過JCheckBoxMenuItemJMenuBar上按需隱藏JTabbedPane一旦顯示JTabbedPane,我該如何隱藏它?

我以前做過的事情看起來完全一樣,但這次不起作用。我試過使用invokeLater(...)但無濟於事。

這裏是我工作的一個基本的例子:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.DefaultListModel; 
import javax.swing.JCheckBoxMenuItem; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTabbedPane; 

public class ToolkitFrame extends JFrame { 

    private static final long serialVersionUID = -6757985823719418526L; 

    public static void main(String[] args) { 
     new ToolkitFrame().construct(); 
    } 

    private UtilityTabs utilityTabs; 

    public UtilityTabs getUtilityTabs() { 
     if (utilityTabs == null) { 
      utilityTabs = new UtilityTabs(); 
     } 
     return new UtilityTabs(); 
    } 

    public ToolkitFrame() { 
     super(); 
    } 

    public void construct() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     add(getGameScreen(), BorderLayout.CENTER); 
     add(getUtilityTabs().getTabs(), BorderLayout.EAST); 
     setJMenuBar(getJMenuBar()); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public JMenuBar getJMenuBar() { 
     JMenuBar menuBar = new JMenuBar(); 
     JMenu viewMenu = new JMenu("View"); 
     final JCheckBoxMenuItem checkbox = new JCheckBoxMenuItem("Show Utilities"); 
     checkbox.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       getUtilityTabs().getTabs().setVisible(checkbox.isSelected()); 
       System.out.println("Tabs should be: " + (checkbox.isSelected() ? "visible" : "hidden")); 
      } 

     }); 
     checkbox.setSelected(true); 

     viewMenu.add(checkbox); 

     menuBar.add(viewMenu); 

     return menuBar; 
    } 

    public JPanel getGameScreen() { 
     JPanel panel = new JPanel(); 
     panel.setPreferredSize(new Dimension(765, 503)); 
     panel.setBackground(Color.BLACK); 
     return panel; 
    } 

    class UtilityTabs { 

     private JTabbedPane tabs; 

     public JTabbedPane getTabs() { 
      return tabs; 
     } 

     private Tab tab; 

     public Tab getTab() { 
      if (tab == null) { 
       tab = new Tab(); 
      } 
      return tab; 
     } 

     public UtilityTabs() { 
      tabs = new JTabbedPane(JTabbedPane.TOP); 
      tabs.setPreferredSize(new Dimension(275, 503)); 
      tabs.add("FooBar", getTab()); 
      tabs.setVisible(true); 
     } 

     class Tab extends JPanel { 

      private static final long serialVersionUID = 677183279827434278L; 

      private DefaultListModel<String> listModel; 

      private JList<String> list; 

      public Tab() { 
       construct(); 
      } 

      public void construct() { 
       listModel = new DefaultListModel<String>(); 
       for (String name : new String[] { "foo", "bar" }) { 
        listModel.addElement(name); 
       } 
       list = new JList<String>(listModel); 
       add(new JScrollPane(list)); 
      } 

     } 

    } 

} 

誰能告訴我什麼,我做錯了嗎?我基本上希望根據用戶設置顯示或隱藏遊戲的實用程序(無需重新啓動)。

使用setVisible(false)將不會顯示它們,但如果我希望在不重新啓動應用程序的情況下完成此操作,則這無濟於事。

回答

3

查看您的getUtilityTabs函數,無論使用哪種utilityTabs,您都將始終返回一個新的UtilityTabs。因此,設置新實用程序標籤的可見性對您已創建的標籤沒有任何影響。

這應該修復它:

public UtilityTabs getUtilityTabs() { 
    if (utilityTabs == null) { 
     utilityTabs = new UtilityTabs(); 
    } 
    return utilityTabs; 
} 
+0

完全忽視了...謝謝。 – Aeterna 2013-03-05 02:04:24

相關問題