Swing 如何实现actionListener

Swing 如何实现actionListener,swing,actionlistener,Swing,Actionlistener,我正在开发一个JavaSwing应用程序,从数据库中选择数据。但是我的操作侦听器不工作。请帮帮我。执行程序时没有显示错误。请检查我的代码 public class Availability implements ActionListener { JPanel panelForMedicine,inputPanel; JLabel mediLabel; JComboBox listCombo; JButton dbButton; final String

我正在开发一个
JavaSwing
应用程序,从
数据库
中选择数据
。但是我的
操作侦听器
不工作。请帮帮我。执行程序时没有显示错误。请检查我的代码

public class Availability implements ActionListener {

    JPanel panelForMedicine,inputPanel;
    JLabel mediLabel;
    JComboBox listCombo;
    JButton dbButton;
    final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
    final String DB_URL = "jdbc:mysql://localhost/paliative_care_unit";
    final String USER = "root";
    final String PASS = "root";
    Connection conn = null;
    Statement stmt=null;

    static void guiBuilder(){
        JFrame availabilityFrame=new JFrame("Check Stock");
        availabilityFrame.setLocation(0, 0);
        availabilityFrame.setSize(390,150);
        availabilityFrame.setVisible(true);
        availabilityFrame.setDefaultCloseOperation(availabilityFrame.DISPOSE_ON_CLOSE);
        Availability availability=new Availability();
        availabilityFrame.setContentPane(availability.mainPanel());
        availability.mainPanel();
    }

    public JPanel mainPanel(){
        JPanel availabilityPanel=new JPanel();
        availabilityPanel.setLayout(null);

        panelForMedicine=new JPanel();
        //panelForMedicine.setLayout(null);
        panelForMedicine.setSize(70, 40);
        panelForMedicine.setLocation(30, 35);

        availabilityPanel.add(panelForMedicine);

        mediLabel=new JLabel("Medicine");
        mediLabel.setLocation(0, 0);
        mediLabel.setSize(70, 40);
        panelForMedicine.add(mediLabel);

        inputPanel=new JPanel();
        inputPanel.setLayout(null);
        inputPanel.setSize(150, 40);
        inputPanel.setLocation(120,35);
        availabilityPanel.add(inputPanel);

        listCombo=new JComboBox();
        listCombo.setSize(150, 30);
        listCombo.setLocation(0, 0);
        inputPanel.add(listCombo);

        try{
            Class.forName(JDBC_DRIVER);
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            stmt = conn.createStatement();
            String sql="SELECT  DISTINCT medi FROM paliative"; 

            ResultSet rs=stmt.executeQuery(sql);

            while(rs.next()){
                listCombo.addItem(rs.getString("medi"));
                //medicineField.setSelectedItem("attempt11");
            }
        }
        catch(Exception e){System.out.println(e);}

        dbButton=new JButton("GO");
        dbButton.setSize(70, 30);
        dbButton.setLocation(300, 35);
        dbButton.addActionListener(this);

        availabilityPanel.add(dbButton);
        availabilityPanel.setOpaque(true);
        return availabilityPanel;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if(e.getSource()==dbButton){
            System.out.println("Checking");
            try{
                System.out.println("Checking");
                Class.forName(JDBC_DRIVER);
                conn = DriverManager.getConnection(DB_URL, USER, PASS);
                stmt = conn.createStatement();
                String sql="SELECT  * FROM paliative WHERE medi='"+listCombo.getSelectedItem().toString()+"'";
                ResultSet rs=stmt.executeQuery(sql);
                while(rs.next()){
                    System.out.println(rs.getString(1));
                    System.out.println(rs.getString(2));
                }
            }
            catch (Exception ex) {
                JFrame dialogFrame=new JFrame();
                JOptionPane.showMessageDialog(dialogFrame, ex);
            }
        }
    }
}

正如@nicE cOw指出的,您在
guiBuilder()
方法中调用了
availability.mainPanel()
两次。这将在
dbButton
变量添加到contentPane后更改对该变量的引用,这将使
if(e.getSource()==dbButton)
条件在操作侦听器中失败

解决方案:删除对
availability.mainPanel()的第二个调用
guiBuilder()中

此外:
请仔细阅读Swing线程。您不应该在事件分派线程中执行长时间运行的操作(如数据库调用)。尝试初学者。

您是否尝试过检查sql查询?:)为什么在
guiBuilder()
方法中调用
availability.mainPanel()
两次?此外,
DISPOSE\u ON\u CLOSE
是一个静态字段,请务必了解约定,此字段必须用
类名
引用,而不是它的引用。在理解您所使用的概念以及您所描述的情况发生的原因时,这些事情会让人有点困惑。如果您去医院告诉医生“它不起作用”,他会回答您一些问题。那么我来了,到底是什么不起作用?:-)单击dbButton时什么也没发生仅供参考,您在这里有一个SQL注入漏洞:
String SQL=“SELECT*FROM palitive WHERE medi=”+listCombo.getSelectedItem().toString()+”“
@bhavisankar:请查看,因为如果您认为这个答案确实对您有帮助,请将其标记为答案,为了帮助未来的访客:-)