Java 如何在密钥侦听器范围外使用布尔值
我创建了一个购物车登录JFrame,并添加了一个ShopKeepToggle,这样当按下它时,用户登录到店主的JFrame,或者登录到购物者的JFrame。问题是我不知道如何实现它,我尝试在ShopKeepToggle键侦听器中释放键时将布尔值pressed设置为false,显然我无法在登录按钮中使用pressed的值 以下是切换的代码:Java 如何在密钥侦听器范围外使用布尔值,java,swing,jframe,awt,keylistener,Java,Swing,Jframe,Awt,Keylistener,我创建了一个购物车登录JFrame,并添加了一个ShopKeepToggle,这样当按下它时,用户登录到店主的JFrame,或者登录到购物者的JFrame。问题是我不知道如何实现它,我尝试在ShopKeepToggle键侦听器中释放键时将布尔值pressed设置为false,显然我无法在登录按钮中使用pressed的值 以下是切换的代码: shopkeeperToggle = new JToggleButton("Shopkeeper"); shopkeeperToggle.ad
shopkeeperToggle = new JToggleButton("Shopkeeper");
shopkeeperToggle.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
pressed = false;
}
});
这就是我在“登录”按钮中要做的:
signinButton = new JButton("Sign in ");
signinButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3308/shoppingCart","root","");
// select the users that have the inputted credentials from the database
String sql = "SELECT * FROM users WHERE userUsername = ? AND userEmail =?AND userPassword = ? ";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,usernamelogin.getText());
ps.setString(2, emaillogin.getText());
ps.setString(3,passwordlogin.getText());
ResultSet rs = ps.executeQuery();
// if query executed and
if (rs.next()) {
// if login succ show window log succ, and go to home shopping page
JOptionPane.showMessageDialog(null,"Login successful! :)");
/////////////////this is where I fail////////////////////
if (pressed) {
OwnerHomePage ownerhome = new OwnerHomePage();
ownerhome.setVisible(true);
setVisible(false);
} else {
UserHomePage home = new UserHomePage();
home.setVisible(true);
setVisible(false);
}
} else {
JOptionPane.showMessageDialog(null,"Wrong Username or Email or Password :(");
}
} catch (Exception e1) {
JOptionPane.showMessageDialog(null,e1);
}
}
}
您可以将pressed定义为静态值
class c {
static boolean pressed = true;
...
}
你可以访问任何地方
c.pressed; //will return true if you don't change
这可能会为解决您的问题提供一些帮助。这是一个完全可编译的演示。进行了以下更改 使用操作代替KeyListener。设置稍微复杂一点,但它们可以配置为只监视某些键。 使用JButton代替JToggleButton。没有具体原因,可以更改。 为侦听器创建了单独的内部类。有助于减少混乱,通常可读性更强。 根据模式更改按钮的名称。
内部或嵌套类和动作映射包含在boolean pressed=signinButton.isSelected中;你是个救世主我认为静态是最适合外部访问的。它给了我一个错误,说参数非法
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractAction;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
public class ActionMapAndButtons {
JFrame frame = new JFrame("Demo");
public static void main(String[] args) {
SwingUtilities
.invokeLater(() -> new ActionMapAndButtons().start());
}
public void start() {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyClass cls = new MyClass();
frame.add(cls);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
class MyClass extends JPanel {
JButton button = new JButton("Shopper Sign in");
boolean pause = false;
public MyClass() {
setPreferredSize(new Dimension(300, 300));
button.addActionListener(new ButtonListener());
add(button);
InputMap map = getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
for (int i = 0; i < 256; i++) {
map.put(KeyStroke.getKeyStroke((char)i), "anyKey");
}
getActionMap().put("anyKey", new MyAction());
setFocusable(true);
}
private class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent ae) {
Object obj = ae.getSource();
if (obj instanceof JButton) {
JButton b = (JButton) obj;
pause = !pause;
if (pause) {
b.setText("Shopkeeper Sign in");
} else {
b.setText("Shopper Sign in");
}
}
}
}
private class MyAction extends AbstractAction {
public void actionPerformed(ActionEvent ae) {
String cmd = ae.getActionCommand();
if (pause) {
System.out.println("Shopkeeper - " + cmd);
} else {
System.out.println("Shopper - " + cmd);
}
}
}
}