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:请查看,因为如果您认为这个答案确实对您有帮助,请将其标记为答案,为了帮助未来的访客:-)