Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 顽固的JComboBox_Java_Swing_Jcombobox - Fatal编程技术网

Java 顽固的JComboBox

Java 顽固的JComboBox,java,swing,jcombobox,Java,Swing,Jcombobox,我有一个JComboBox,如下面的代码所示。当程序启动时,它的actionPerformed事件立即触发,导致一些空指针异常,因此我希望在开始时不选择任何元素。但是,由于某些原因,它不起作用(无论我做什么,它总是从显示“USD/TRY”开始)。有人知道吗 JComboBox comboBox = new JComboBox(new String[]{"USD/TRY", "EUR/TRY", "GBP/TRY"}); comboBox.setSelectedIndex(-1); // doe

我有一个JComboBox,如下面的代码所示。当程序启动时,它的actionPerformed事件立即触发,导致一些空指针异常,因此我希望在开始时不选择任何元素。但是,由于某些原因,它不起作用(无论我做什么,它总是从显示“USD/TRY”开始)。有人知道吗

JComboBox comboBox = new JComboBox(new String[]{"USD/TRY", "EUR/TRY", "GBP/TRY"});

comboBox.setSelectedIndex(-1); // doesnt change anything
comboBox.setSelectedIndex(2); // doesnt change anything     
comboBox.setSelectedItem(null); // doesnt change anything
更新:像下面这样构建组合框也不会改变任何东西

JComboBox comboBox = new JComboBox(); 

comboBox.addItem("USD/TRY"); 
comboBox.addItem("EUR/TRY"); 
comboBox.addItem("GBP/TRY"); 
以下是SSCCE:

public class MainFrame {

    private final JTextArea textArea = new JTextArea();
    private IExchangeSource s;

    public MainFrame(final IExchangeSource s) {
        //build gui
        final JComboBox comboBox = new JComboBox();

        comboBox.addItem("USD/TRY");
        comboBox.addItem("EUR/TRY");
        comboBox.addItem("GBP/TRY");

        comboBox.setSelectedIndex(-1); // doesnt change anything
        //comboBox.setSelectedIndex(2); // doesnt change anything


        JFrame f = new JFrame("Currency Converter");
        JPanel p = new JPanel(new BorderLayout());
        textArea.setName("textarea");
        textArea.setWrapStyleWord(true);
        textArea.setLineWrap(true);
        this.s = s;

        comboBox.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                String exchange = (String) comboBox.getSelectedItem();

                s.getData(exchange);
            }
        });

        p.add(comboBox, BorderLayout.NORTH);
        p.add(textArea, BorderLayout.CENTER);
        f.setPreferredSize(new Dimension(300, 300));
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.add(p);
        comboBox.setSelectedIndex(0);
        f.setVisible(true);
    }
}
1) 添加而不是
ActionListener
,但此
itemsListener
始终触发两次事件
SELECTED
diselected

  myComboBox.addItemListener(new ItemListener() {

        @Override
        public void itemStateChanged(ItemEvent e) {
            if (e.getStateChange() == ItemEvent.SELECTED) {
                //some stuff
            }
        }
    });
2) 您的GUI可能是在上创建的,也可能不是在上创建的,但在这种情况下并不重要,例如,您必须通过封装到invokeLater()来延迟此方法

public class MainFrame {
     .
     .
     .

    f.setPreferredSize(new Dimension(300, 300));
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.pack();
    f.add(p);
    comboBox.setSelectedIndex(0);
    f.setVisible(true);
    selectDesiredItem();
}

private void selectDesiredItem() {
  EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            comboBox.setSelectedIndex(-1);
        }
    });  
}
3) 更好的是货币对

4) 也许不重要,但CCYPAIR默认有四个方面

  • Buy BaseCcy

  • Sell BaseCcy

  • Buy variableCY

  • Sell variableCY


到目前为止,这些建议都很好。但有时,当组件的构造方式真的令人费解时,需要更直接的解决方案:

  • JComboBox的子类(或任何激发事件、JList等的Swing类)
  • 添加一个字段,
    private boolean firevents=false
    ;考虑使它<代码>易失性< /代码> .
  • 重写相关的
    fireXXX()
    方法以检查fireEvents的状态
  • 只有在所有构造和初始化完成后才能设置
    firevents=true
  • 如果以后需要“大修”,例如加载新文件、新设置时,可以在重建所有内容时将fireEvents设置回false 您的(不完整)示例调用

    comboBox.setSelectedIndex(0);
    
    在显示之前,取消以前的任何设置。在添加侦听器之前设置所需的初始索引,不要忽略从开始,如下所示


    在创建JComboBox之后尝试加载字符串[]?拥有异常的堆栈跟踪会有所帮助。如何将ActionListener添加到一个尚未创建的组合框中?您无法避免选择一个值,但即使这样,您的问题也显然存在于其他地方。actionPerformed处理程序究竟在什么情况下引发异常?您可能应该稍后在正确初始化完成后分配它,或者检查它的内部状态。我从来没有遇到过这个问题。发布您的演示问题的文章。窗口生成器不应更改任何内容。没有理由不能手动构建GUI。事实上,这是我推荐的方法,因为您学习的是Swing而不是GUI。您所要做的就是阅读JComboxAPI,并按照Swing教程的链接,在
    如何使用组合框
    中找到一个工作示例。谢谢。其他答案在一定程度上解决了问题,但仍然存在一些问题,但这一个完全解决了问题。我认为主要问题是缺少用于构建框架的invokeLater函数(即:从EDT开始);我总是对揭露EDT问题的新方法感兴趣。@Cemre,你读过API和教程吗???教程中的示例正确地使用了EDT,这就是为什么我在几个小时前向您指出了教程。@camickr由于某种原因,您的链接不起作用,因此我当时无法检查它,对此表示抱歉。我将谷歌和研究它现在。我对swing有点陌生,所以我没有意识到EDT的重要性。谢谢你的帮助。@Cemre,我没有给你链接。我希望您能够阅读API并自己点击链接。如果你是Swing新手,那么这就是按照建议阅读教程的更多理由,而不是希望有人为你编写代码。非常感谢你的详细回答。我真的很感激。虽然您的第二个建议解决了组合框错误,但我仍然遇到空指针异常。@kleopatra新年快乐-1当事情真的很复杂时,主要是因为应用程序代码出错。因此,与随机的不雅子类化、古怪的标志或混乱的覆盖不同,第一步是挖掘和理解具体上下文中的错误并修复它
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    
    public class MainFrame {
    
        private final JTextArea textArea = new JTextArea();
    
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new MainFrame();
                }
            });
        }
        public MainFrame() {
            //build gui
            final JComboBox comboBox = new JComboBox();
    
            comboBox.addItem("USD/TRY");
            comboBox.addItem("EUR/TRY");
            comboBox.addItem("GBP/TRY");
    
            JFrame f = new JFrame("Currency Converter");
            JPanel p = new JPanel(new BorderLayout());
            textArea.setName("textarea");
            textArea.setWrapStyleWord(true);
            textArea.setLineWrap(true);
    
            comboBox.setSelectedIndex(-1);
            comboBox.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println(comboBox.getSelectedItem() + ": " + e);
                }
            });
    
            p.add(comboBox, BorderLayout.NORTH);
            p.add(textArea, BorderLayout.CENTER);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.pack();
            f.setSize(new Dimension(300, 300));
            f.add(p);
            f.setVisible(true);
        }
    }