我在使用Pi4J库导入的Raspberry Pi 3上使用Netbeans 8.2。
这里的问题是 Login.java 不会在 MainForm.java 的public static void main(String args[])
内执行编写的代码。但是,只要我通过右键单击并选择“运行文件”直接运行它,MainForm.java
中的代码就可以运行,但是当我运行整个项目时,就是问题开始的时候。
以下是Login.java
的代码:
package Kiosk;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Login extends javax.swing.JFrame {
public Login() {
initComponents();
jLabel_asterisk1.setVisible(false);
jLabel_asterisk2.setVisible(false);
jPanel1.getRootPane().setDefaultButton(jButton_login);
}
@SuppressWarnings("unchecked")
private void jButton_loginActionPerformed(java.awt.event.ActionEvent evt) {
//asterisk required
jLabel_asterisk1.setVisible(false);
jLabel_asterisk2.setVisible(false);
if(jTextField_username.getText().equals("")){
jLabel_asterisk1.setVisible(true);
}
if(String.valueOf(jPasswordField.getPassword()).equals("")){
jLabel_asterisk2.setVisible(true);
}
else{
Connection con = MyConnection.getConnection();
PreparedStatement ps;
try {
ps = con.prepareStatement("SELECT * FROM users WHERE username = ? AND password = ?");
ps.setString(1, jTextField_username.getText());
ps.setString(2, String.valueOf(jPasswordField.getPassword()));
ResultSet rs = ps.executeQuery();
if(rs.next()){
MainForm mf = new MainForm();
mf.setVisible(true);
mf.pack();
mf.setLocationRelativeTo(null);
MainForm.jLabel_welcome.setText(jTextField_username.getText());
this.dispose();
}
else{
System.out.println("NO");
}
} catch (SQLException ex) {
Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Login().setVisible(true);
}
});
}
}
对于MainForm.java
:
package Kiosk;
import javax.swing.JLabel;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import com.pi4j.wiringpi.Gpio;
import com.pi4j.wiringpi.GpioInterrupt;
import com.pi4j.wiringpi.GpioInterruptListener;
import com.pi4j.wiringpi.GpioInterruptEvent;
import com.pi4j.wiringpi.GpioUtil;
public class MainForm extends javax.swing.JFrame {
public static volatile int pulses = 0;
public static boolean display = true;
public MainForm() {
initComponents();
}
@SuppressWarnings("unchecked")
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MainForm().setVisible(true);
}
});
//create listener //bill coin pulses
GpioInterrupt.addListener(new GpioInterruptListener() {
@Override
public void pinStateChange(GpioInterruptEvent event) {
if (event.getPin() == 0) {
if (event.getState() == false) {
pulses++;
display = true;
}
}
if (event.getPin() == 7) {
if (event.getState() == false) {
int bpulses = 0;
bpulses++;
pulses += bpulses * 10;
display = true;
}
}
}
});
//setup wiring pi
if (Gpio.wiringPiSetup() == -1) {
System.out.println("Setup Failed!");
return;
}
//pins that will be used
GpioUtil.export(7, GpioUtil.DIRECTION_IN);
GpioUtil.export(0, GpioUtil.DIRECTION_IN);
//edge state whether rising, falling or change
GpioUtil.setEdgeDetection(7, GpioUtil.EDGE_FALLING);
GpioUtil.setEdgeDetection(0, GpioUtil.EDGE_FALLING);
//enabling input as a callback
Gpio.pinMode(7, Gpio.INPUT);
Gpio.pullUpDnControl(7, Gpio.PUD_UP);
GpioInterrupt.enablePinStateChangeCallback(7);
//enabling input as a callback
Gpio.pinMode(0, Gpio.INPUT);
Gpio.pullUpDnControl(0, Gpio.PUD_UP);
GpioInterrupt.enablePinStateChangeCallback(0);
//void loop
for (;;) {
//Thread.sleep(5000);
if (display == true) {
// System.out.println(pulses);
jTextField_pulses.setText(String.valueOf(pulses));
display = false;
}
}
}
}
答案 0 :(得分:0)
如果我理解你的问题是你在使用Login.java中的MainForm时没有调用MainForm.java中的main
方法。
原因是main
方法是程序的入口点而不是你的课程。这就是为什么整个程序中通常只有一种主要方法。如果运行Login.java,则在main方法中输入程序。但是,当调用MainForm时,您已经在程序中,因此它不再调用main。同样,当您单独运行MainForm.java时,它需要输入程序并运行main。
建议的解决方案: 用另一种方法(称为initializePinListening左右)将Main从MainForm.java中移出并调用它。
只是为了记录,有一个东西作为课程的入口点。方法是static{}
。但我认为这里使用它的代码风格很糟糕。