【问题标题】:Display the item based on the first item in JComboBox根据 JComboBox 中的第一项显示该项
【发布时间】:2016-06-26 14:51:55
【问题描述】:

在 GUI 中,我有两个 JComboBox,其中所有的组合框项目都是从两个 tables 检索的,它们是 title 和 time。 In my current code, when the title is selected, displayDate(selected); will get called since I have implemented addActionListener in Select comboBox.

但这不是我想要的。运行此文件时,我希望它立即根据 Select JcomboBox 中的第一项显示日期。 When the Select comboBox item changed, only the date changed.正确的写作方式是什么?

  public class BuyTicket {  
    static JFrame frame;
    JLabel title,lblMainDate,selectMovie,dateOfShow;
    JComboBox Select,Date;

    public JPanel createContentPane() throws IOException
    {

        title = new JLabel("CYBER CINEMA");
        Select = new JComboBox();
        Select.setLocation(115,90);
        Select.setSize(175, 20);
        try {   
            DatabaseConnection db=new DatabaseConnection();
            Connection connect=db.getConnection();
            String sql="Select title FROM movie";
            PreparedStatement ps=connect.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
            String name = rs.getString("title");
            Select.addItem(name);         
        }

    } catch (Exception e) {
        System.out.println("null");
    }


        Select.addActionListener(new ActionListener()
        {
    public void actionPerformed(ActionEvent event)
        {
         JComboBox comboBox=(JComboBox) event.getSource();
         Object selected = Select.getSelectedItem();
         displayDate(selected);
        }

    private void displayDate(Object selected) {
        // TODO Auto-generated method stub
          try { 
                Date.removeAllItems();
                DatabaseConnection db=new DatabaseConnection();
                Connection connect=db.getConnection();
                String sql="Select date FROM movie WHERE title = ?";
                PreparedStatement ps=connect.prepareStatement(sql);
                ps.setObject(1, selected);
                ResultSet rs = ps.executeQuery();
                while (rs.next()) {
                String date1 = rs.getString("date");
                DefaultComboBoxModel model = (DefaultComboBoxModel)Date.getModel();
                if (model.getIndexOf(date1) == -1)
                {
                    Date.addItem(date1);
                }

            }

        } catch (Exception e) {
            System.out.println("null");
        }


    }
        });
    }

已编辑

public class BuyTicket {

    static JFrame frame;
    JLabel title,lblMainDate,selectMovie,dateOfShow;
    JComboBox Select,Date;

    public JPanel createContentPane() throws IOException
    {
        Select = new JComboBox();
        Select.setLocation(115,90);
        Select.setSize(175, 20);
        try {   
            DatabaseConnection db=new DatabaseConnection();
            Connection connect=db.getConnection();
            String sql="Select title FROM movie";
            PreparedStatement ps=connect.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
            String name = rs.getString("title");
            Select.addItem(name);         
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

        Select.addActionListener(new ActionListener()
        {
    public void actionPerformed(ActionEvent event)
        {
         JComboBox comboBox=(JComboBox) event.getSource();
         Object selected = Select.getSelectedItem();
         displayDate(selected);
        }
        });

        String getMovie = (String)Select.getSelectedItem(); // New code added, directly display the Date JComboBox items 
        System.out.println(getMovie);
        displayDate(getMovie);
        Date = new JComboBox();
        Date.setLocation(115,140);
        Date.setSize(175, 20);
    }

    private void displayDate(Object selected) {
        // TODO Auto-generated method stub
          try { 
                Date.removeAllItems();
                DatabaseConnection db=new DatabaseConnection();
                Connection connect=db.getConnection();
                String sql="Select date FROM movie WHERE title = ?";
                PreparedStatement ps=connect.prepareStatement(sql);
                ps.setObject(1, selected);
                ResultSet rs = ps.executeQuery();
                while (rs.next()) {
                String date1 = rs.getString("date");
                DefaultComboBoxModel model = (DefaultComboBoxModel)Date.getModel();
                if (model.getIndexOf(date1) == -1)
                {
                    Date.addItem(date1);
                }

            }

        } catch (Exception e) {
            e.printStackTrace();
        }


    }

}

我添加了一些代码,但日期仍然无法直接显示,并且出现nullpointer 错误。

最新输出

Angry Bird
java.lang.NullPointerException
    at gui.BuyTicket.displayDate(BuyTicket.java:131)
    at gui.BuyTicket.createContentPane(BuyTicket.java:87)
    at gui.BuyTicket.createAndShowGUI(BuyTicket.java:115)
    at gui.HomePage$2.mouseClicked(HomePage.java:151)
    at java.awt.Component.processMouseEvent(Unknown Source)

【问题讨论】:

    标签: java mysql swing nullpointerexception actionlistener


    【解决方案1】:

    将您的selectDate(...) 设为BuyTicket 类的方法,将其移出ActionListener 的范围。然后在完成第一次数据库搜索并填充第一个 JComboBox 后,直接调用此方法,传入第一个 JComboBox 中的第一项。

    即,改变这个:

    public class BuyTicket {
        //...
    
        public JPanel createContentPane() throws IOException {
            // ...
            Select.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    // ...
                }
    
                // within addActionListener scope
                private void displayDate(Object selected) {
                    // ...
                }
            });
            // ...
        }
    }
    

    到这里:

    public class BuyTicket {
        //...
    
        public JPanel createContentPane() throws IOException {
            // ...
            Select.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    // ...
                }
    
            });
            // ...
        }
    
        // within class scope
        private void displayDate(Object selected) {
            // ...
        }
    } 
    

    作为附带建议,您将希望学习和使用Java naming conventions。变量名应全部以小写字母开头,而类名应以大写字母开头。学习这一点并遵循这一点将使我们能够更好地理解您的代码,并让您更好地理解其他人的代码。


    建议 2:您将希望在后台线程中执行所有数据库搜索,例如 SwingWorker。您将希望使用回调机制(例如 PropertyChangelistener)在工作人员完成时通知您,以便您可以提取和显示它收集的数据。例如:

    更多内容请查看教程——Lesson: Concurrency in Swing


    建议 3:您真的不想拥有这样的代码:

    } catch (Exception e) {
        System.out.println("null");
    }
    

    至少打印出堆栈跟踪(例如,e.printStacktrace();),这样您就会知道发生了哪些异常(如果有)。此外,您应该捕获特定异常,而不是过于宽泛的Exception。


    关于:

    java.lang.NullPointerException
        at gui.BuyTicket.displayDate(BuyTicket.java:131)
        at gui.BuyTicket.createContentPane(BuyTicket.java:87)
        at gui.BuyTicket.createAndShowGUI(BuyTicket.java:115)
        at gui.HomePage$2.mouseClicked(HomePage.java:151)
        at java.awt.Component.processMouseEvent(Unknown Source)
    

    您现在遇到了一个全新且独特的问题。请为我们指出哪一行是BuyTicket.java:131,因为该行上有一个为空的变量,并且您尝试使用它,就好像它引用了一个对象一样。调试此问题的关键是批判性地查看该行,查看哪个变量为空或使用调试器或 println 来帮助确定哪个为空,然后修复您的代码,使其不再为空。见:What is a NullPointerException, and how do I fix it?


    线BuyTicket.java:131 是Date.removeAllItems();。错误似乎来自 displayDate(getMovie);,我刚刚添加的新代码

    所以 Date JComboBox 为空,如果您查看代码,很明显为什么,以及如何修复它——在构造函数中创建它,而不是在 ActionListener 中。

    【讨论】:

    • 先生,我听从了您的建议,但日期仍然没有显示。它仍然需要我先选择 JComboBox 中的项目,然后只显示日期。
    • 行 BuyTicket.java:131 是 Date.removeAllItems();。错误似乎来自 displayDate(getMovie);,我刚刚添加的新代码。
    • 你的意思是在构造函数中创建函数吗?
    • @JohnJoe:我不确定您所说的“创建函数”是什么意思,但底线是变量在使用之前必须引用有效对象。在这里你可以玩弄你的代码,看看你是否可以根据你所知道的来修复它。祝你好运。
    • 先生,您能具体说明一下在构造函数中创建它,而不是在 ActionListener 中是什么意思吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多