2012-05-22 22 views
6

Próbuję sprawdzić poprawność dynamicznie elementu wybranego przez JComboBox i chcę anulować zmianę wyboru w przypadku, gdy sprawdzanie poprawności nie jest poprawne . Czy jest jakiś sposób, aby to osiągnąć?Anulowanie zmiany wyboru w JComboBox, jeśli warunek jest spełniony (np. Sprawdzanie poprawności w wybieraniu przychodzącym)

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

próbowałem zdefiniować var ​​gospodarstwa starą wartość, wyrejestrowanie słuchacza, a następnie wybierz ręcznie do poprzedniego stanu, ale problem jest z pierwszej zmianie, ponieważ var nie jest inicjowany i there's żaden sposób przytrzymaj oryginalną wartość.

Próbowałem również przy użyciu ActionListener, ale nie znalazłem żadnego sposobu, aby programowo anulować zmianę, i nie potrzebuję zdarzenia ognia, wtedy nie ma zmiany, ale oceniam możliwość ręcznego wyboru metody setSelection, więc powracam do ItemListener.

Odpowiedz

4

Mogę to zrobić, nie wiem dlaczego nie możesz tego zrobić. Spojrzeć na ten przykład kodu, wybierz trzy razy żadnych wartości, a następnie na raz czwarty to powróci do pustym ciągiem:

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

kod z poprzedniej wartości

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

Ale czy comboImage.setSelectedItem ("") wraca do poprzedniego wyboru? To brzmi dla mnie, gdy powraca do domyślnego lub pierwszego, ale sprawdzę i odpowiem – Whimusical

+0

@ user1352530 what9s zwraca DESELECTED z ItemListener – mKorbel

+0

Nie rozumiem ... W moim przypadku dodanie setSelectedItem ("") nie powoduje wraca do poprzedniego stanu. – Whimusical

5

w początkowym scenariusz gdy poprzedni wybór nie jest obecna tylko domyślnie do domyślnego indeksu selekcyjnego, jak 0.

Zobacz przykładowy kod poniżej:

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

Po raz pierwszy, gdy textField nie zawiera żadnych danych, po prostu wybiera element domyślny, w tym przypadku jego element 0, możesz go mieć własny. Jeśli dane są obecne, sprawdza, a następnie decyduje, czy należy zastosować obecny wybór.

0

W rzeczywistości nie ma sposobu, aby zapobiec zmianie wyboru w JComboBox. Wszystkie poprzednie przykłady tak naprawdę nie uniemożliwiają zmiany wyboru, zamiast tego po prostu ustawiają wybór z powrotem na poprzednio wybrany element PO jego zmianie.

Jeśli spojrzysz na JTree, znajdziesz TreeWillExpandListener, który da ci możliwość wetowania rozszerzenia, ponieważ otrzymasz TreeWillExpandEvent PRZED rozszerzeniem.

Po dodaniu ItemListener do JComboBox otrzymasz zmieniony wybór itemEvents AFTER. Jeśli stateChange ItemEvent jest DESELECTED, wówczas getItem() poda wcześniej wybrany element. Jednak jeśli wywołasz getSelectedItem(), to dostaniesz inny element, ponieważ selekcja jest już zmieniona.

Powiązane problemy