2015-06-30 8 views
5

In una parte del mio programma uso uno JOptionPane per chiedere all'utente se è sicuro di ciò che farà. Ma non voglio annoiare l'utente chiedendo che ogni volta che provi così mi piace usare la funzione di alcune finestre di dialogo in Android che vengono con "Non chiedere più", ma non so come implementarlo nel mio programma qualcuno qui potresti aiutarmi? (dovrebbe avere uno StackOverflow spagnolo) Questo è il mio codiceCome creare una finestra di dialogo "non chiedermelo più" con 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

Perché non si utilizza un flag (booleano) per indicare se è stato dimostrato che la finestra di dialogo? Impostare il flag su true una volta che è stato mostrato, e controllare la bandiera prima di mostrare? – Gosu

+0

Sì, ci penso, ma il problema è che quando chiudo il programma, dopo la riapertura chiederà di nuovo la stessa cosa. Quindi voglio chiedere solo 1 volta –

+0

Quindi dovresti salvare quell'impostazione e scriverla su un file che il programma dovrebbe analizzare per quella risposta. Almeno è quella che sembra la risposta più ovvia se vuoi chiedere una volta e mai più. – Ungeheuer

risposta

8

L'idea di base è quella di approfittare del fatto parametro message può effettivamente essere un Component. Il problema poi si riduce a controllo per vedere se l'utente ha selezionato l'opzione "Non mi chiedere di nuovo", la memorizzazione e la ri-utilizzarlo

Qualcosa di simile ...

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

} 

Come base di partenza punto. Ho usato Properties come l'archivio di backup per semplicità, è possibile utilizzare un database o altro metodo persistenti (Preferences, XML, ecc)

Poi si potrebbe utilizzare qualcosa come ...

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

Se selezioni "Non chiedermelo più" al primo prompt, la seconda chiamata restituirà il valore precedentemente selezionato

Ora, da qualche parte, probabilmente vorrai avere la possibilità di invertire queste decisioni;)

+0

Wow, con questa risposta e l'altra prima che potessi fallo, grazie ragazzi :) –

+0

Questo è così buono. Mi piace soprattutto come hai permesso al messaggio di essere sia stringa che 'JComponent'! –

5

JOptionPane permette anche la visualizzazione di Component come messaggio. Quindi, questo problema può essere risolto in questo modo:

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

Ho un'idea, come posso salvare lo stato della casella dopo che JOP è stato chiuso? –

+0

@ KevinAlemàn basta aggiungere un 'ActionListener' alla casella di controllo – Paul

+0

@ KevinAlemán In qualsiasi modo tu voglia. Fondamentalmente, hai bisogno di una sorta di "identificatore" in modo da poter fare una ricerca e memorizzare il risultato della selezione (supponendo che abbiano scelto di ignorare ulteriori richieste) – MadProgrammer

2

Utilizzando alcune delle risposte qui, sono riuscito a risolvere il mio problema, lo condividerò qui nel caso in cui qualcun altro possa essere interessato:

Ho una casella di controllo valida solo durante la sessione corrente per ripristinare una finestra di chat, la casella di controllo è disponibile nella parte "opzioni" della mia applicazione, anche un'altra appare quando si fa clic sul pulsante di ripristino.

il codice per ActionListener del pulsante è al di sotto, con i commenti necessari:

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