【问题标题】:Button that opens a new JFrame打开新 JFrame 的按钮
【发布时间】:2021-03-25 03:11:59
【问题描述】:

我正在编写一个程序,其中我应该有一个游戏的标题屏幕,您可以在其中单击一个“播放”按钮,该按钮打开一个不同的窗口并同时关闭另一个窗口。我正在尝试做的是利用 ActionListener 作为按钮,使当前窗口不可见,同时使不同的窗口可见。我很难让它工作并且遇到很多语法和逻辑错误。我很确定有更好的方法可以做到这一点,所以任何指针都将不胜感激。我正在使用摆动。 免责声明:初学者 java 级程序员大声笑:p

我的第一堂课包括这个(不包括我的进口):


    public static void main(String[] args) {

        //Creating the Frame
        MyFrame menuFrame = new MyFrame();

    // (here i have code for the frame in my actual program)
    }
    static class MyFrame extends JFrame {

        MyFrame () {

            this.setDefaultCloseOperation
                    (JFrame.EXIT_ON_CLOSE);

            this.getContentPane().add(new JLabel(new ImageIcon("logo.png")));
            this.pack();
            this.setVisible(true);

            new EightOff.returnHomeListener (this);

        }
    }
}

打开另一个框架的我的另一个类包括以下按钮和动作侦听器,我试图从 GameMenu 引用我的框架:

public class EightOff
{
private static JButton returnHome = new JButton("Return to Game Menu");

public static class returnHomeListener implements ActionListener {
        public returnHomeListener(GameMenu.MyFrame myFrame) {

        }

        @Override
        public void actionPerformed(ActionEvent e)
            {
                returnHomeListener (JFrame visibleFrame) {
                visibleFrame.toSetVisible (true);
            }
        }
    }
}

【问题讨论】:

  • Swing 有一个CardLayout 布局管理器,允许您使用一个 JFrame,但将底层 JPanel 从标题 JPanel 切换到游戏 JPanel。 Oracle 教程Creating a GUI With JFC/Swing 将教您创建 Swing GUI 的正确方法。

标签: java swing jframe


【解决方案1】:

你应该先看看How to Use Buttons, Check Boxes, and Radio ButtonsHow to Write an Action Listener

ActionListener 应该注册到按钮上,所以当某些动作发生时可以通知 if,例如...

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JButton button = new JButton("Click me");
                button.addActionListener(new TestActionListener());

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(button);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestActionListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(null, "I'd prfefer if you did't do that");            
        }

    }
}

为了对对象进行更改,您首先需要对该对象的引用。这是非常基本的 Java 101 类型的东西,您应该查看Passing Information to a Method or a Constructor 了解更多详细信息。

您还应该阅读JavaDocs for JFrame,以更好地了解该类提供的属性和功能。

看看How to Make Frames也不会有什么坏处。

我建议您查看How to use CardLayout 而不是尝试隐藏/显示窗口,您通常会有更好的用户体验。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多