【问题标题】:JFrame call is opening two JFramesJFrame 调用正在打开两个 JFrame
【发布时间】:2019-08-25 10:36:13
【问题描述】:

我创建了一个生成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");
    }
}

在第一个窗口中单击“管理”按钮,它会打开一个 AdminMainWindow JFrame 而正在生成两个。

【问题讨论】:

  • “调用一种新的JFrame”The Use of Multiple JFrames, Good/Bad Practice?
  • 1) 使用逻辑一致的形式缩进代码行和块。缩进是为了让代码流更容易理解!大多数 IDE 都有专门用于格式化代码的键盘快捷键。 2) 请对代码和代码 sn-ps、HTML/XML 等结构化文档或输入/输出使用代码格式。为此,请选择文本并单击消息发布/编辑表单顶部的{} 按钮。
  • 感谢@Andrew Thompson 的建议,但我确实在 intellij 中对其进行了格式化 - 当我在这里添加它时,它要求我缩进四个,因为我在 IDE 中使用了标准格式,我不确定它在做什么。可能是我的评论。

标签: java swing jframe jpanel jbutton


【解决方案1】:

您已经添加了两次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();
}

【讨论】:

  • 噢!我怎么能错过!谢谢@Butiri Dan
  • 如果它有助于解决问题,请accept the answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
相关资源
最近更新 更多