Whi*_*cal 6 java events swing jcombobox itemlistener
我试图动态验证JComboBox选择的项目,我想取消选择更改,以防验证不正确.有没有办法实现它?
private ItemListener itemListener = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
if (true) CANCEL_CHANGE;
}
}
};
Run Code Online (Sandbox Code Playgroud)
我尝试定义一个包含旧值的var,取消注册侦听器,并手动选择到先前的状态,但随后第一次更改出现问题,因为var未初始化且无法保存原始值.
我也尝试过使用ActionListener,但发现无法以编程方式取消更改,而且我不需要fire事件然后没有变化,但我正在评估手动设置setSelection的可能性,所以我恢复为ItemListener.
在前一个选择不存在的初始场景中,只需将其默认为默认选择索引,如0.
请参阅以下示例代码:
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();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
第一次textField不包含任何数据时,它只选择默认项,在这种情况下是第0个元素,你可以拥有它自己的.如果存在数据,则检查然后确定是否应该使用当前选择.
我可以做到,不知道为什么你不能做到。看一下这个代码示例,选择任意值三次,然后第四次它将恢复为空字符串:
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();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
具有先前值的代码
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();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)