2012-05-22 10 views
6

Sto provando a convalidare dinamicamente un elemento selezionato da un JComboBox e voglio annullare la modifica della selezione nel caso in cui la convalida non sia corretta . C'è un modo per raggiungerlo?Annullamento della modifica della selezione su un JComboBox se la condizione è soddisfatta (es. Convalida sulla selezione in entrata)

private ItemListener itemListener = new ItemListener() { 
    @Override            
    public void itemStateChanged(ItemEvent e) { 
     if (e.getStateChange() == ItemEvent.SELECTED) { 
      if (true) CANCEL_CHANGE; 
     } 
    } 
}; 

ho cercato di definire una var tiene il vecchio valore, unregistering ascoltatore e selezionare allo stato precedente manualmente, ma poi il problema viene fornito con il primo cambiamento, perché la var non è inizializzato e Theres nessun modo mantenere il valore originale.

Ho anche provato ad utilizzare ActionListener, ma non ho trovato alcun modo per annullare la modifica e non ho bisogno di eventi di attivazione, quindi non c'è alcun cambiamento, ma sto valutando la possibilità di setSelection manualmente, quindi tornerò a ItemListener.

risposta

4

Posso farlo, non so perché non puoi farlo. Date un'occhiata a questo esempio di codice, selezionare tre volte i valori, poi la quarta volta che tornerà alla stringa vuota:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class ComboTest { 

    private JLabel imageLabel; 
    private JComboBox comboImage; 

    private String[] names = {"", "ukIcon","caIcon","unknwon"}; 
    private boolean flag; 
    private int counter; 

    public ComboTest(){ 
     flag = false; 
     counter = 0; 
     initComponents(); 
    } 

    public void initComponents(){ 
     JFrame frame = new JFrame("Test Combo");   
     frame.setSize(320, 160); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new FlowLayout()); 

     comboImage = new JComboBox(names); 
     comboImage.addItemListener(new ItemListener(){ 
      public void itemStateChanged(ItemEvent event){ 
       if(event.getStateChange() == ItemEvent.SELECTED){ 
        if (flag) 
         comboImage.setSelectedItem(""); 
        else 
        { 
         counter++; 
         if (counter == 3) 
          flag = true; 
         System.out.println((String) comboImage.getSelectedItem()); 
        } 
       } 
      } 
     }); 

     frame.add(comboImage); 
     frame.setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new ComboTest(); 
      } 
     }); 
    } 
} 

codice con valore precedente

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class ComboTest { 

    private JLabel imageLabel; 
    private JComboBox comboImage; 

    private String[] names = {"", "ukIcon","caIcon","unknwon"}; 
    private boolean flag; 
    private int counter; 
    private String previousValue; 

    public ComboTest(){ 
     flag = false; 
     counter = 0; 
     previousValue = ""; 
     initComponents(); 
    } 

    public void initComponents(){ 
     JFrame frame = new JFrame("Test Combo");   
     frame.setSize(320, 160); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new FlowLayout()); 

     comboImage = new JComboBox(names); 
     comboImage.addItemListener(new ItemListener(){ 
      public void itemStateChanged(ItemEvent event){ 
       if(event.getStateChange() == ItemEvent.SELECTED){ 
        if (flag) 
         comboImage.setSelectedItem(previousValue); 
        else 
        { 
         counter++; 
         if (counter == 3) 
          flag = true; 
         previousValue = (String) comboImage.getSelectedItem(); 
         System.out.println((String) comboImage.getSelectedItem()); 
        } 
       } 
      } 
     }); 

     frame.add(comboImage); 
     frame.setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new ComboTest(); 
      } 
     }); 
    } 
} 
+0

Ma comboImage.setSelectedItem ("") torna alla selezione precedente? Mi sembra che ritorni al valore predefinito o prima, ma controllerò e rispondo a – Whimusical

+0

@ user1352530 cosa restituisce DESELECTED da ItemListener – mKorbel

+0

Non capisco ... Nel mio caso l'aggiunta di setSelectedItem ("") non rende torna allo stato precedente. – Whimusical

5

Nella prima scenario in cui la selezione precedente non è presente è predefinita per l'indice di selezione predefinito, come 0.

Vedere il codice di esempio riportato di seguito:

import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 


import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class TestChangeListener { 

    final JTextField jTextField = new JTextField(20); 
    Object list[] = { "ItemA", "ItemB" }; 
    int oldSelectionIndex = -1; 
    final JComboBox jComboBox = new JComboBox(list); 

    void init() { 
     JFrame jFrame = new JFrame("Test"); 
     JPanel jPanel = new JPanel(); 
     new TestChangeListener(); 
     jPanel.add(jTextField); 
     jPanel.add(jComboBox); 
     jFrame.add(jPanel); 
     jComboBox.addItemListener(new ItemListener() { 
      @Override 
      public void itemStateChanged(ItemEvent event) { 
       if (event.getStateChange() == ItemEvent.SELECTED) { 
        if (!"Okay".equalsIgnoreCase(jTextField.getText())) { 
         if (oldSelectionIndex < 0) { 
          jComboBox.setSelectedIndex(0); 
         } else { 
          jComboBox.setSelectedIndex(oldSelectionIndex); 
         } 
        } else { 
         oldSelectionIndex = jComboBox.getSelectedIndex(); 
        } 
       } 
      } 
     }); 
     jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jFrame.pack(); 
     jFrame.setVisible(true); 
    } 

    public static void main(String args[]) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new TestChangeListener().init(); 
      } 
     }); 
    } 
} 

La prima volta che textField non contiene dati, seleziona solo l'elemento predefinito, in questo caso il suo 0 ° elemento, puoi averlo tu. Se i dati sono presenti, controlla e poi decide se la selezione corrente debba essere usata o meno.

0

Infatti, non c'è modo di impedire che la selezione cambi in JComboBox. Tutti gli esempi precedenti non impediscono realmente il cambio di selezione, ma semplicemente impostano la selezione sull'elemento selezionato in precedenza DOPO che è stato modificato.

Se guardi JTree, troverai TreeWillExpandListener, che ti darà la possibilità di espandere il veto, perché riceverai TreeWillExpandEvent PRIMA che si espanda.

Se aggiungi ItemListener a JComboBox riceverai ItemEvents DOPO la selezione modificata. Se stateChange di ItemEvent è DESELECTED, quindi getItem() ti darà l'elemento selezionato in precedenza. Tuttavia se chiami getSelectedItem() ti darà un altro elemento, perché la selezione è già stata cambiata.

Problemi correlati