2015-06-30 19 views
5

Programımın bir bölümünde, kullanıcıdan ne yapacağından emin olup olmadıklarını sormak için JOptionPane kullanıyorum. Ama ben her zaman deneyin her zaman sormak zorunda istemiyorum, bu yüzden "tekrar sorma" ile gelen android bazı iletişim kutularının işlevini kullanmak istiyorum, ama benim programımda uygulamak için nasıl bilmiyorum Burada birileri bana yardım edebilir misin? (bir İspanyol StackOverflow olmalı) Bu aynı zamanda mesaj olarak Component görüntülendiği verir kodumJava ile “bir daha sorma” iletişim kutusu nasıl açılır?

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

Neden iletişim gösterilmiştir belirtmek için bir bayrak (boolean) kullanmıyorsun? Gösterildikten sonra bayrağı doğru olarak ayarlayın ve gösterilmeden önce bayrağı kontrol edin. – Gosu

+0

Evet, ama bununla ilgili problem, programı kapattığımda, tekrar açıldıktan sonra tekrar aynı şeyi soracağım. Bu yüzden sadece 1 kez –

+0

sormak istiyorum O zaman bu ayarı kaydetmeniz ve programın bu cevap için ayrıştırılacağı bir dosyaya yazmanız gerekir. En azından bu bir kez sormak ve bir daha asla istemiyorsanız en belirgin cevap gibi görünüyor. – Ungeheuer

cevap

8

temel fikir aslında bir Component olabilir aslında message parametresini istifade etmektir. O zaman sorun temel başlangıç ​​olarak

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

} 

... depolanması ve ona

şey gibi yeniden kullanarak, kullanıcı "Yeniden sorma" seçeneğini seçili olmadığını görmek için kontrol iner puan. Kullandığım Properties basitlik için destek deposu olarak, bir veritabanı veya diğer kalıcı yöntem (Preferences, XML, vs)

Sonra tıpkı o şey kullanabilirsiniz kullanabilirsiniz ...

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

İlk komutta "Beni bir daha sorma" yı seçerseniz, ikinci arama daha önce seçilen

değerini döndürür. Şimdi, bir yerlerde, bu kararları tersine çevirme yeteneğine sahip olmak isteyeceksiniz;

+0

Vay, bu cevap ve diğer Yapın, teşekkürler çocuklar :) –

+0

Bu çok güzel. Özellikle mesajın hem string hem de “JComponent” olmasına nasıl izin verdiğini beğendim! –

5

JOptionPane olduğunu. Yani bu sorunun bu şekilde çözülebilir:

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

Fikrinizi aldım, JOP kapatıldıktan sonra onay kutusunun durumunu nasıl kaydedebilirim? –

+0

@ KevinAlemàn sadece bir ActionListener 'kutucuğunu – Paul

+0

@ KevinAlemán onay kutularına ekleyin. Temel olarak, bir tür "tanımlayıcı" ye ihtiyacınız vardır, böylece bir seçim yapabilir ve seçim sonucunu saklayabilirsiniz (başka bir uyarıyı göz ardı etmeyi seçtiklerini varsayarak) – MadProgrammer

2

Yanıtların bir kısmını burada, sorunu çözmeyi başardım, başkalarının ilgilenebileceği durumlarda burada paylaşacağım:

Sohbet penceresini sıfırlamak için yalnızca geçerli oturum sırasında geçerli bir onay kutunuz var, onay kutusu, uygulamamın "seçenekler" bölümünde kullanılabilir, ayrıca sıfırlama düğmesine tıklandığında başka bir tane görünür. Düğmenin ActionListener için

kod gerekli yorumlarla, aşağıdaki gibidir:

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