Как узнать, какая ссылка stati c in Java - PullRequest
0 голосов
/ 04 августа 2020

Сейчас я работаю над GUI простой системой заказа еды. Я создал кнопку, которая всякий раз, когда пользователь нажимает на нее, переключает go на другой кадр, однако я сталкиваюсь с проблемой, когда хочу закрыть первый кадр (setVisible (false)).

Это мой первый кадр

public class MainFrame extends JFrame {
    
    private Manager manager = new Manager();
    private JPanel titlepane;
    private JLabel title;
    
    MainFrame(String name){
        setTitle(name);
    }
    
    public void content() {
        Font titlefont = new Font("Times New Roman", Font.PLAIN, 22);
        setLayout(new BorderLayout());
        
        titlepane = new JPanel();
        title = new JLabel("Welcome to POS!");
        title.setFont(titlefont);
        titlepane.add(title);
        manager.LoginGUI();
        
        add(titlepane,BorderLayout.NORTH);
        add(manager,BorderLayout.CENTER);
    }
    
    public void runGUI() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                content();
                setSize(700,700);
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setVisible(true);
                setLocationRelativeTo(null);
            }
        });
    }

Это еще один класс, где кнопка

public class Manager extends JPanel implements ActionListener {

    private ArrayList<AccountInfo> manager = new ArrayList<AccountInfo>();
    private GridBagConstraints gbc = new GridBagConstraints();

    private JLabel id;
    private JLabel pw;

    private JTextField idfill;
    private JTextField pwfill;

    private JButton login;

    private int isManager = 0;

    private String idinput, pwinput;
    private int temp = -1;

    Manager() {
        this.manager.add(new AccountInfo("admin", "1234"));
    }

    public void addManager(AccountInfo newManager) {
        this.manager.add(newManager);
    }

    public void LoginGUI() {
        Font standard = new Font("Times New Roman", Font.PLAIN, 18);
        setLayout(new GridBagLayout());

        id = new JLabel("ID");
        id.setFont(standard);
        // Alignment
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.ipadx = 10;
        gbc.ipady = 10;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.fill = GridBagConstraints.VERTICAL;
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        add(id, gbc);

        idfill = new JTextField(10);
        idfill.setFont(standard);
        // Alignment
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        add(idfill, gbc);

        pw = new JLabel("Password");
        pw.setFont(standard);
        // Alignment
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        add(pw, gbc);

        pwfill = new JTextField(10);
        pwfill.setFont(standard);
        // Alignment
        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        add(pwfill, gbc);

        login = new JButton("Login");
        login.setFont(standard);
        login.addActionListener(this);
        // Alignment
        gbc.gridx = 1;
        gbc.gridy = 2;
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        add(login, gbc);
    }

    public void actionPerformed(ActionEvent e) {
        verify();
        if(isManager == 1) {
            MenuFrame menu = new MenuFrame("Menu");
            menu.runGUI();
            MainFrame.setVisible(false);    // This is the problem
        }
    }

    private void verify() {
        idinput = idfill.getText().trim();
        pwinput = pwfill.getText();
        for (int i = 0; i < manager.size(); i++) {
            if (idinput.equals(manager.get(i).id)) {
                temp = i;
            }
        }
        
        if(temp == -1) {
            JOptionPane.showMessageDialog(null, "Id or password incorrect, try again");
        } else if(pwinput.equals(manager.get(temp).password)) {
            isManager = 1;
        } else 
            JOptionPane.showMessageDialog(null, "Id or password incorrect, try again");
    }
}

(Коды немного длинны, так как я не уверен, что другая часть была правильной. Все, что я знаю, это ничего делать с MenuFrame)

Я получаю эту ошибку:

Невозможно сделать статическую c ссылку на нестатический c метод setVisible (boolean) из типа Window

Возможно, это моя вина, когда мне не достаточно очевидно знать, какая часть Manager или MainFrame является stati c. Я также встречал другие сообщения по той же проблеме, но ни одна из них не связана с моей. (В другом сообщении был очевидный метод stati c)

Также попытался создать объект MainFrame в Manager, но это ухудшило ситуацию, пожалуйста, помогите, спасибо!

1 Ответ

1 голос
/ 04 августа 2020

Вам действительно нужно держать где-нибудь доступным объект MainFrame , держите ссылку на него. Для этого MVC, Model-View-Controller, - хорошая парадигма.

  1. Используйте MVC

Лично у меня есть main для поворота в классе контроллера (таким образом, контроллер является классом приложения). Он создает основной фрейм (вид), и контроллер передается.

public void actionPerformed(ActionEvent e) {
    verify();
    if(isManager == 1) {
        MenuFrame menu = new MenuFrame("Menu");
        menu.runGUI();
        controller.setMainFrameVisible(false);
    }
}

Контроллер:

private MainFrame mainFrame;

public setMainFrameVisible(boolean visible) {
    MainFrame.setVisible(visible);
}
Передайте экземпляр MainFrame.

Однако вы также можете передать MainFrame:

private final MainFrame mainFrame;

Manager(MainFrame mainFrame) {
    this.mainFrame = mainFrame;
}

public void actionPerformed(ActionEvent e) {
    verify();
    if(isManager == 1) {
        MenuFrame menu = new MenuFrame("Menu");
        menu.runGUI();
        mainFrame.setVisible(false);
    }
}

Если панель находится внутри MainFrame

((JFrame) getTopLevelAncestor ()). SetVisible (false);

Совет:

В случае выхода приложения (EXIT_ON_CLOSE) измените операцию закрытия по умолчанию.

MainFrame(String name){
    setTitle(name);
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...