我想创建一个事件,该事件将在我对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();