2012-01-30 70 views
2

我想做一个事件,在我选择JComboBox后触发。 我现在面临的问题是,当我添加一个ActionListener时,它被触发时,用户点击框,但在他实际上选择了新项目之前,因此动作侦听器始终激活前一个值是在框中选中。我想要做的只是根据选择改变JTextArea的标题。 我试图做这样的事情:我如何使一个JComboBox事件触发后选择?

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

我已经使用所选的事件试过现在这个样子:

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

,但它似乎将面板从面板上移除而不加回来...为什么会发生这种情况?

+0

请学习java的命名约定并坚持使用它们 – kleopatra 2012-01-30 11:16:40

+0

@Yonatan Nir看到我的编辑 – mKorbel 2012-01-30 11:25:14

+0

a)无法重现您描述的行为方式b)看起来没有加回来的是自我感觉疼痛(通过不使用一个布局管理器)无论如何,为什么_do_你删除并重新添加...只是改变textArea的状态,并开心 – kleopatra 2012-01-30 11:27:19

回答

2

聆听来自JComboBox事件是更好的工具ItemListener,返回两个事件SELECTED/DESELECTED

编辑

如果删除/在运行时添加的JComponent(S)和已经显现的容器,那么你必须调用(如至少代码线)

revalidate(); 
repaint(); 
+1

使用任一行动或itemListener主要是一个味道的问题,后者只有真正需要,如果你想知道取消选中的项目(无法使用actionListener获取它,因为在选择发生更改后会触发该项目)。没有这个需求,去做最简单的事,那就是Action。 – kleopatra 2012-01-30 11:30:55

2

下面是一个简单的示范与样品代码:

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