2015-06-30 23 views
5

在我的程序的一部分中,我使用JOptionPane詢問用戶他們是否確定他會做什麼。但我不想讓用戶問,每次嘗試這樣我都喜歡使用android中的一些對話框的功能,這些對話框隨「不要再詢問」一起提供,但不知道如何在我的程序中實現,有人在這裏你可以幫我嗎? (應該有一個西班牙語的StackOverflow) 這是我的代碼如何使用java創建「不要再問我」對話框彈出框?

if (jCheckBox2.isSelected() && jCheckBox1.isSelected()){ 
     JOptionPane.showConfirmDialog(null, "This action can cause problems, want to do it?"); 
     //here must be something to never ask again this 

    } 
+0

你爲什麼不使用標誌(布爾)來指示對話是否已被證明?一旦顯示標誌爲真,並在顯示前檢查標誌? – Gosu

+0

是的,我認爲這一點,但問題是當我關閉該程序,重新打開後,它會再次要求同樣的事情。所以我只想問一次 –

+0

然後你需要保存這個設置並把它寫到一個文件中,程序會解析這個文件。至少這是什麼似乎是最明顯的答案,如果你想問一次,永遠不會。 – Ungeheuer

回答

8

的基本思路是採取的事實優勢message參數實際上可以是一個Component。那麼問題歸結爲檢查,以查看用戶是否選擇了「不要再問我」選項,存儲和再利用它

喜歡的東西...

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.FlowLayout; 
import java.io.File; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.Reader; 
import java.io.Writer; 
import java.util.Properties; 
import javax.swing.JCheckBox; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class DontAskMeAgainPanel extends JPanel { 

    private JCheckBox dontAskMeAgain; 

    public DontAskMeAgainPanel(Object message) { 
     setLayout(new BorderLayout()); 
     if (message instanceof Component) { 
      add((Component) message); 
     } else if (message != null) { 
      add(new JLabel(message.toString())); 
     } 
     dontAskMeAgain = new JCheckBox("Don't ask me again"); 
     JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); 
     panel.add(dontAskMeAgain); 
     add(panel, BorderLayout.SOUTH); 
    } 

    public boolean dontAskMeAgain() { 
     return dontAskMeAgain.isSelected(); 
    } 

    private static Properties settings; 

    protected static void loadProperties() { 
     if (settings != null) { 
      settings = new Properties(); 
      File source = new File("..."); 
      if (source.exists()) { 
       try (Reader r = new FileReader(source)) { 
        settings.load(r); 
       } catch (IOException exp) { 
        exp.printStackTrace(); 
       } 
      } 
     } 
    } 

    protected static void saveProperties() { 
     if (settings != null) { 
      settings = new Properties(); 
      File source = new File("..."); 
      try (Writer w = new FileWriter(source)) { 
       settings.store(w, "Don't prompt for settings"); 
      } catch (IOException exp) { 
       exp.printStackTrace(); 
      } 
     } 
    } 

    public static int showConfirmDialog(Component parent, Object message, String key) { 

     loadProperties(); 

     int result = JOptionPane.NO_OPTION; 

     if (settings.containsKey(key + ".prompt") && !Boolean.parseBoolean(settings.getProperty(key + ".value"))) { 
      result = Integer.parseInt(settings.getProperty(key + ".value")); 
     } else { 
      DontAskMeAgainPanel panel = new DontAskMeAgainPanel(message); 
      result = JOptionPane.showConfirmDialog(parent, panel); 
      if (panel.dontAskMeAgain()) { 
       settings.put(key + ".prompt", "false"); 
       settings.put(key + ".value", Integer.toString(result)); 

       saveProperties(); 
      } 
     } 
     return result; 
    } 

} 

作爲基本出發點。我用Properties的後備存儲爲簡單起見,你可以使用一個數據庫或其他持久性方法(PreferencesXML等)

然後,你可以只使用它像...

int result = DontAskMeAgainPanel.showConfirmDialog(null, "This is annoying", "Annoying"); 
System.out.println("You selected " + result); 
result = DontAskMeAgainPanel.showConfirmDialog(null, "This is annoying", "Annoying"); 
System.out.println("Then you selected " + result); 

如果在第一個提示中選擇「不要再問我」,那麼第二個電話將返回以前選擇的值

現在,在某個地方,您可能想要有能力扭轉這些決策; )

+0

哇,有了這個答案和另一個之前,我能夠這樣做,謝謝你們:) –

+0

這是非常好的。我特別喜歡你如何讓消息既是字符串又是'JComponent'! –

5

JOptionPane還可以顯示Component的消息。所以這個問題是可以解決這樣說:

JPanel msgPanel = new JPanel(); 

JLabel msg = new JLabel("some message"); 
msgPanel.add(msg); 

JCheckBox jcb = new JCheckBox("do not ask me again"); 
msgPanel.add(jcb); 

JOptionPane.showConfirmDialog(null , msgPanel , "some title" , JOptionPane.OK_CANCEL_OPTION); 
+0

我明白了,如何在JOP關閉後保存複選框的狀態? –

+0

@KevinAlemàn只需將「ActionListener」添加到複選框 – Paul

+0

@KevinAlemán任何你想要的方式。基本上,你需要某種「標識符」,所以你可以查找並存儲選擇結果(假設他們已經選擇忽略任何進一步的提示) – MadProgrammer

2

使用這裏的一些答案,我已經設法解決我的問題,我會在這裏分享,以防其他人可能會感興趣:

我有一個複選框只在當前會話期間有效重置聊天窗口,該複選框在我的應用程序的「選項」部分中可用,另外一個單擊復位按鈕時出現。

的按鈕的ActionListener的代碼下面,必要的註釋:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

jButtonReset.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       //this checkbox is the one available in app settings 
       if (!surpassResetConfirmCheckBox.isSelected()) { 
        JPanel msgPanel = new JPanel(); 

        // message inside confirmation dialog 
        JLabel msg = new JLabel("Are you sure you wish to clear current conversation?"); 
        msgPanel.add(msg); 

        JCheckBox jcb = new JCheckBox("do not ask me again."); 
        jcb.addActionListener(new ActionListener() { 

         @Override 
         public void actionPerformed(ActionEvent arg0) { 
          // if-else statement below is used to update checkbox in settings whenever this one is changed. 
          if (jcb.isSelected()) { 
           surpassResetConfirmCheckBox.setSelected(true); 
          } else { 
           surpassResetConfirmCheckBox.setSelected(false); 
          } 

         } 
        }); 
        msgPanel.add(jcb); 

        // JOptionPane returns an integer value ,we'll use it later 
        int result = JOptionPane.showConfirmDialog(null, msgPanel, "Reset Conversation", 
          JOptionPane.OK_CANCEL_OPTION); 

        // check user's response.. 
        if (result == JOptionPane.OK_OPTION) { 
         // if user clicked Ok , call your method here 
         // reset(); 
        } else if (result == JOptionPane.CANCEL_OPTION || result == JOptionPane.CLOSED_OPTION) { 
         // if user closed the dialog or clicked cancel, uncheck the checkbox in settings 
         surpassResetConfirmCheckBox.setSelected(false); 
        } 
       } else { 
        // if checkbox in settings is checked, call your method immediately 
        // reset(); 
       } 
      } 
     }); 
    } 
相關問題