2016-07-14 113 views
0

我有一個幫助窗格,它出現在程序的開始處,但可以關閉。如果用戶希望它返回,菜單欄中有一個選項可以重新激活它。但是,當他們選擇從幫助菜單中顯示時,它會自動重新檢查「不再顯示」框。我如何保持框與用戶原來的狀態相同,但仍然打開幫助窗格?JCheckBox狀態在類間保持一致

桂:

public class Gui { 
    private Game game; 
    private JFrame frame; 
    private MenuBar menuBar; 

    private HelpDialog helpMenu; 
    private boolean showHelp; 

    public Gui(Game game) { 
     this.game = game; 
     this.showHelp = true; 
     this.createAndShowGUI(); 
    } 

    public boolean shouldShowHelpDialog() { 
     return this.showHelp; 
    } 

    public void displayHelp() { 
     this.helpMenu.showHelpDialog(); 
    } 

菜單欄:

public class MenuBar { 
    private JMenuBar menuBar; 
    private JMenu menu; 
    private JMenuItem menuItem; 
    private JFrame frame; 
    private Gui gui; 
    private Game game; 

    public MenuBar(JFrame frame, Gui gui, Game game) { 
     this.menuBar = new JMenuBar(); 
     this.frame = frame; 
     this.gui = gui; 
     this.game = game; 
    } 

    public void buildMenuBar() { 
     this.buildFileMenu(); 
     this.buildSettingsMenu(); 
     this.buildHelpMenu(); 

     this.frame.setJMenuBar(this.menuBar); 
    } 

    private void buildHelpMenu() { 
     this.menu = new JMenu("Information"); 
     this.menu.setMnemonic(KeyEvent.VK_I); 
     this.menu.getAccessibleContext().setAccessibleDescription("Help menu"); 

     JMenuItem menuHelp = new JMenuItem("Help", KeyEvent.VK_H); 
     menuHelp.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       MenuBar.this.gui.displayHelp(); 
      } 
     }); 
     this.menu.add(menuHelp); 

     this.menuBar.add(this.menu); 
    } 

HelpDialog:

public class HelpDialog { 

    private boolean shouldShowHelpDialog; 
    private JFrame theFrame; 

    public HelpDialog(boolean helpDialog, JFrame frame) { 
     this.shouldShowHelpDialog = helpDialog; 
     this.theFrame = frame; 
    } 

    public boolean showHelpDialog() { 
     if (!this.shouldShowHelpDialog) { 
      return false; 
     } 

     JCheckBox shouldShowCheckBox = new JCheckBox("Do not show this message again", this.shouldShowHelpDialog); 

     Object[] msgContent = { this.buildHelpPane(), shouldShowCheckBox }; 

     JOptionPane.showMessageDialog(this.theFrame, msgContent, "Help", JOptionPane.INFORMATION_MESSAGE); 

     return shouldShowCheckBox.isSelected(); 
    } 

    private Object buildHelpPane() { 
     String helpMessage = "Game rules: This is how you play."; 

     JTextArea helpTextArea = new JTextArea(helpMessage); 
     helpTextArea.setRows(6); 
     helpTextArea.setColumns(40); 
     helpTextArea.setLineWrap(true); 
     helpTextArea.setWrapStyleWord(true); 
     helpTextArea.setEditable(false); 
     helpTextArea.setOpaque(false); 

     JScrollPane helpPane = new JScrollPane(helpTextArea); 
     return helpPane; 
    } 
} 

編輯:

更新HelpDialog類:

public class HelpDialog { 
     private boolean shouldShowHelpDialog; 
     private JFrame theFrame; 
     private JCheckBox shouldShowCheckBox; 

     public HelpDialog(boolean helpDialog, JFrame frame) { 
      this.shouldShowHelpDialog = helpDialog; 
      this.theFrame = frame; 


      this.shouldShowCheckBox = new JCheckBox("Do not show this message again", this.shouldShowHelpDialog); 
     } 

     public boolean showHelpDialog() { 
      if (!this.shouldShowHelpDialog) { 
       return false; 
      } 

      Object[] msgContent = { this.buildHelpPane(), shouldShowCheckBox }; 

      JOptionPane.showMessageDialog(this.theFrame, msgContent, "Help", JOptionPane.INFORMATION_MESSAGE); 

      return shouldShowCheckBox.isSelected(); 
     } 

當通過菜單欄顯示幫助菜單時,該複選框現在保持未標記狀態。但是,現在當創建新遊戲時,即使該框未被選中,它也會顯示幫助對話框。

完整的答案包括這種變化的方法適用於GUI:

public void displayHelp() { 
    this.showHelp = this.helpMenu.showHelpDialog(); 
} 

回答

4

你showHelpDialog()方法創建每個被調用時,一個新的複選框。你應該在構造函數中創建一次對話框,而showHelpDialog()應該只顯示它​​。

+0

已添加編輯。在新遊戲中,幫助對話框仍然顯示,現在框中未選中。 –

+0

發現錯誤。添加到上面的編輯。這個解決方案讓我知道了! –

0

您可以添加參數showHelpDialog它覆蓋了你的要求

public boolean showHelpDialog(boolean override) { 
    if(!override){ 
     if (!this.shouldShowHelpDialog) { 
      return false; 
     } 
    } 

    JCheckBox shouldShowCheckBox = new JCheckBox("Do not show this message again", this.shouldShowHelpDialog); 

    Object[] msgContent = { this.buildHelpPane(), shouldShowCheckBox }; 

    JOptionPane.showMessageDialog(this.theFrame, msgContent, "Help", JOptionPane.INFORMATION_MESSAGE); 

    return shouldShowCheckBox.isSelected(); 
}  

,從菜單中單擊時調用

showHelpDialog(true);