Как использовать логическое значение вне области действия ключевого слушателя - PullRequest
0 голосов
/ 11 апреля 2020

Я создал JFrame для входа в корзину и добавил «shopkeeperToggle», чтобы при нажатии пользователь входил в JFrame продавца, а в остальном в jframe покупателя. проблема в том, что я не знаю, как это реализовать, я пытался установить логическое «нажатие» на «ложь» всякий раз, когда ключ отпускается в слушателе ключа «shopkeeperToggle», и, очевидно, я не могу использовать значение нажатой внутри кнопка входа.

Вот код для переключения:

    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);
                    }
                }
            }

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Это может помочь вам решить вашу проблему. Это полностью компилируемая демка. Были внесены следующие изменения:

  • Использовано Actions вместо KeyListener. Немного больше вовлечено в настройку, но они могут быть настроены для мониторинга только определенных ключей.
  • Используется JButton вместо JToggleButton. Не указана c причина и может быть изменена.
  • Созданы отдельные внутренние классы для слушателей. Имеет тенденцию уменьшать беспорядок и обычно более читабелен.
  • Изменение имени кнопки в зависимости от режима.
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);
            }
        }
    }
}

Inner (или nested) классов и action карты представлены в Java Учебниках

0 голосов
/ 11 апреля 2020

Вы можете определить нажатие как значение c;

class c {
    static boolean pressed = true;

    ...
}

, и вы можете получить доступ куда угодно;

c.pressed; //will return true if you don't change
...