2015-06-30 6 views
5

In einem Teil meines Programms verwende ich eine JOptionPane, um den Benutzer zu fragen, ob sie sicher sind, was er tun wird. Aber ich möchte den Benutzer nicht langweilen und fragen, dass ich jedes Mal, wenn Sie es versuchen, die Funktion einiger Dialogfelder in Android nutzen möchte, die mit dem "Bitte nicht mehr fragen" kommen, aber nicht wissen, wie ich das in meinem Programm implementiere Könntest du mir hier helfen? (Sollte eine spanische Stackoverflow hat) Dies ist mein CodeWie mache ich eine Dialogbox "Frag mich nicht nochmal" mit 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

Warum Sie nicht über einen Flag (boolean), um anzuzeigen, verwenden, ob der Dialog angezeigt wurde? Setzen Sie das Flag nach der Anzeige auf true und überprüfen Sie das Flag, bevor es angezeigt wird? – Gosu

+0

Ja, ich denke daran, aber das Problem damit ist, wenn ich das Programm schließe, nach dem erneuten Öffnen wird es wieder dasselbe fragen. Also ich möchte nur 1 Mal fragen –

+0

Dann müssten Sie diese Einstellung speichern und es in eine Datei schreiben, die das Programm für diese Antwort analysieren würde. Zumindest scheint das die naheliegendste Antwort zu sein, wenn man einmal und nie wieder fragen möchte. – Ungeheuer

Antwort

8

Die Grundidee sich die Tatsache zunutze, die message Parameter zu nehmen ist, kann tatsächlich ein Component sein. Das Problem kommt dann nach unten zu überprüfen, ob der Benutzer der gewählten Option „Mich nicht mehr fragen“, Speicher und Wiederverwenden es

So etwas wie ...

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; 
    } 

} 

Als grundlegender Ausgang Punkt. Ich habe verwendet Properties als Zusatzspeicher für Einfachheit, eine Datenbank oder andere persistente Methode verwenden könnte (Preferences, XML usw.)

Dann könnten Sie es einfach verwenden, so etwas wie ...

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); 

Wenn Sie an der ersten Eingabeaufforderung "Nicht mehr nachfragen" auswählen, gibt der zweite Anruf den zuvor ausgewählten Wert zurück

Jetzt werden Sie wahrscheinlich die Möglichkeit haben, diese Entscheidungen rückgängig zu machen;)

+0

Wow, mit dieser Antwort und der anderen zuvor konnte ich das tun Mach es, danke Jungs :) –

+0

Das ist so gut. Ich mag besonders, wie du erlaubst, dass die Nachricht sowohl String als auch 'JComponent' ist! –

5

JOptionPane ermöglicht auch Component als Meldung angezeigt wird. So kann dieses Problem auf diese Weise gelöst werden:

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

Ich bekomme Ihre Idee, wie kann ich den Zustand des Kontrollkästchens speichern, nachdem JOP geschlossen ist? –

+0

@ KevinAlemàn fügen Sie einfach einen 'ActionListener' in das Kontrollkästchen – Paul

+0

@ KevinAlemán Wie Sie wollen. Im Grunde benötigen Sie eine Art "Kennung", so dass Sie das Ergebnis der Auswahl nachschlagen und speichern können (vorausgesetzt, dass Sie alle weiteren Anweisungen ignoriert haben) – MadProgrammer

2

einige der Antworten Mit hier, ich habe es geschafft, meine Frage zu lösen, ich es hier, falls jemand anderes interessiert sein könnte, teilen werde:

ich eine Checkbox nur während der aktuellen Sitzung gültig sind, um ein Chat-Fenster zurückzusetzen, Das Kontrollkästchen ist im Bereich "Optionen" meiner Anwendung verfügbar. Wenn Sie auf die Schaltfläche Zurücksetzen klicken, wird auch eine andere Option angezeigt.

der Code für die Action der Taste unten, mit notwendigen Kommentaren:

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(); 
       } 
      } 
     }); 
    }