如何将事件设置为触发AFTER选择的JComboBox



我想创建一个事件,该事件将在我对JComboBox进行选择后触发。我现在面临的问题是,当我添加ActionListener时,它是在用户点击框时触发的,但在他真正选择新项目之前,因此ActionListener一直在框中选择的前一个值上激活。我想做的只是根据选择更改JTextArea的标题。我试着做这样的事情:

 jBox.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e) {
    String alt = GetAlgoAreaTitleByChoice();
    panel.remove(jArea);
    currentBest = setArea("",alt);
    currentBest.setBounds(50, 350, 1000, 290);
    panel.add(jArea);
     }
     });

以及里面的方法:

private String GetArgsAreaTitleByChoice(){
    String chi = jBox.getSelectedItem().toString();
    if(chi.equals(generalChoice)){
    return "Hello";
    }
    else if(chi.equals(algoChoice)){
    return "World";
    }
    else if(chi.equals(argsChoice)){
    return "Hello";
    }
    return null;
}

我已经尝试过像这样使用SELECTED事件:

public void itemStateChanged(ItemEvent e) {
JComboBox cb = (JComboBox)e.getSource();
    // Get the affected item
    String item = cb.getSelectedItem().toString();
    if (e.getStateChange() == ItemEvent.SELECTED) {
        panel.remove(jBox);
    textArea = setArea("", item);
        panel.add(jBox);
   }

但它似乎从面板中删除了该区域,而没有将其添加回来。。。为什么会发生这种情况?

下面是一个带有示例代码的简单演示:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Tester {
    public Tester(){
        JComboBox box = new JComboBox();
        box.addItem("One");
        box.addItem("Two");
        box.addItem("Three");

        box.addItemListener(new ItemListener(){
            public void itemStateChanged(ItemEvent e){
                if(e.getStateChange()==ItemEvent.SELECTED){
                    e.getItem();  //Do what ever you want :))
                }
            }
        });
        JFrame frame = new JFrame();
        frame.getContentPane().add(box);
        frame.pack();
        frame.setVisible(true);
    }
    public static void main(String [] args) {
        Tester tester = new Tester();
    }
}

为了监听来自JComboBox的事件,更好地实现ItemListener,返回两个事件SELECTED/DESELECTED

编辑

如果在运行时和已经可见的容器中删除/添加JComponent,则必须调用(作为最少的代码行)

revalidate();
repaint();

相关内容

  • 没有找到相关文章

最新更新