JFrame 调用正在打开两个 JFrame

JFrame call is opening two JFrames

我创建了一个 class 来生成 StartUpWindow 对象。 JButton 组件之一关闭 JFrame,然后调用一种新类型的框架进行实例化,AdminMainWindow。但是,当实例化 AdminMainWindow 时,打开了两个框架。

谁能看到我的代码中的错误?

Main

public class Main {

    public static void main(String[] args) {
        StartUpWindow startUpWindow = new StartUpWindow();
    }
}

StartUpWindow

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class StartUpWindow extends JFrame implements ActionListener {

    private JButton admin;
    private JButton captain;
    private JButton grades;

    public StartUpWindow() {
        setTitle("Start Up Menu");
        setButtons();
        setAction();
        setSize(200, 400);
        setVisible(true);
    }

    void setButtons() {

        admin = new JButton("Admin");
        captain = new JButton("Captain");
        grades = new JButton("Grades");
        getContentPane().setLayout(new FlowLayout());
        add(admin);
        add(captain);
        add(grades);
        setAction();
    }

    void setAction() {
        admin.addActionListener(this);
        captain.addActionListener(this);
        grades.addActionListener(this);

    }

    public void actionPerformed(ActionEvent eve) {

        if (eve.getSource() == admin)
            createAdminMainWindow();
        else if (eve.getSource() == captain)
            createCaptainMainWindow();
        else if (eve.getSource() == grades)
            createGradesMainWindow();

    }

    void createAdminMainWindow() {
        this.dispose();
        AdminMainWindow adminMainWindow = new AdminMainWindow();
    }

    void createCaptainMainWindow() {
        this.dispose();
        //this.adminMainWindow = new CaptainMainWindow();
    }

    void createGradesMainWindow() {
        this.dispose();
        //this.adminMainWindow = new GradesMainWindow();
    }
}

AdminMainWindow

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class AdminMainWindow extends JFrame implements ActionListener {

    private JMenuItem add;
    private JMenuItem edit;
    private JMenuItem delete;
    private JMenuItem view;
    private JMenuItem viewAll;
    private JTextField jt;

    public AdminMainWindow() {
        setTitle("JMenuBar_test");
        setJMenuBarAndMenuBarItems();
        setAction();
        setJTextField();
        setSize(1400, 600);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    void setJTextField() {
        jt = new JTextField(10);
        add(jt);
    }

    void setJMenuBarAndMenuBarItems() {
        JMenuBar menuBar = new JMenuBar();
        JMenu menu1 = new JMenu("Edit");
        add = new JMenuItem("Add");
        edit = new JMenuItem("Edit");
        delete = new JMenuItem("Delete");
        JMenu menu2 = new JMenu("View");
        viewAll = new JMenuItem("View All Entries");
        view = new JMenuItem("View Entry");
        menu1.add(add);
        menu1.add(edit);
        menu1.add(delete);
        menu2.add(viewAll);
        menu2.add(view);
        menuBar.add(menu1);
        menuBar.add(menu2);
        setJMenuBar(menuBar);
    }


    void setAction() {
        add.addActionListener(this);
        edit.addActionListener(this);
        delete.addActionListener(this);
        viewAll.addActionListener(this);
        view.addActionListener(this);
    }

    JFrame setJTextField(JFrame jFrame) {
        JTextField jt = new JTextField(10);
        jFrame.add(jt);
        return jFrame;
    }

    public void actionPerformed(ActionEvent eve) {
        if (eve.getSource() == add)
            jt.setText("Add");
        else if (eve.getSource() == edit)
            jt.setText("Edit");
        else if (eve.getSource() == delete)
            jt.setText("Delete");
        else if (eve.getSource() == viewAll)
            jt.setText("ViewAll");
        else if (eve.getSource() == view)
            jt.setText("ViewOne");
    }
}

在第一个 window 中单击 'Admin' 按钮并打开一个 AdminMainWindow JFrame 而两个正在生成。

您已添加两次 addActionListener 活动。从构造函数中删除 setAction();,然后您的应用程序应按预期运行。

  1. 第一次在构造函数中添加
public StartUpWindow() {
    setTitle("Start Up Menu");
    setButtons();
-- Here -->    setAction();
    setSize(200, 400);
    setVisible(true);
}
  1. 第二次在创建按钮并添加到框架时添加
void setButtons() {
    admin = new JButton("Admin");
    captain = new JButton("Captain");
    grades = new JButton("Grades");

    getContentPane().setLayout(new FlowLayout());
    add(admin);
    add(captain);
    add(grades);
-- Here -->    setAction();
}