Java 在其他jframe中单击按钮时更改其他jframe中的属性

Java 在其他jframe中单击按钮时更改其他jframe中的属性,java,swing,jframe,Java,Swing,Jframe,我有2个jframes,1有点像主菜单,我想在按下按钮时在级别jframes中更改属性,所以我尝试: SpeelVeld frame = new SpeelVeld(); frame.level = 1; System.out.println(frame.level); SpeelVeld frame = new SpeelVeld(); frame.level = 1; System.out.println(frame.level); 我用sout来看看到底发生了什么,因为

我有2个jframes,1有点像主菜单,我想在按下按钮时在级别jframes中更改属性,所以我尝试:

SpeelVeld frame = new SpeelVeld();
    frame.level = 1;
    System.out.println(frame.level);
SpeelVeld frame = new SpeelVeld();
frame.level = 1;
System.out.println(frame.level);
我用sout来看看到底发生了什么,因为它不起作用,但我看到级别从0到1再回到0,然后继续下去,有人知道为什么以及如何修复吗

SpeelVeld frame = new SpeelVeld();


    frame.setBounds(0,0,519,591);
    frame.setLocationRelativeTo(null);
    frame.getContentPane().setBackground(Color.WHITE);
    frame.setTitle("RWINA");
    frame.setVisible(true);
    frame.setLevel(1);
这是我原始GameProject文件的主要方法

如何制作jdialog

我有两个jframes,一个有点像主菜单

您不应该为此使用2个JFrames。从属子窗口(可能是主菜单窗口)实际上应该是一个JDialog,从外观上看可能是一个非模态对话框

我希望在按下按钮时在级别jframe中更改属性,因此我尝试:

SpeelVeld frame = new SpeelVeld();
    frame.level = 1;
    System.out.println(frame.level);
SpeelVeld frame = new SpeelVeld();
frame.level = 1;
System.out.println(frame.level);
这是一个大问题。请理解,在这段代码中,您正在创建一个新的SpeelVeld对象,重音在单词new上。更改此对象的状态不会影响当前显示的另一个SeelVeld对象。如果执行此操作,第二个窗口将需要对显示的SeelVeld对象的有效引用。如何做到这一点将取决于尚未显示的所有代码,但通常可以通过使用构造函数参数或setter方法将显示的SpeelVeld对象传入主菜单对象来完成

例如:

import java.awt.Dialog.ModalityType;    
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

// JPanel for our main GUI
public class SpeelVeldFoo {

    private static void createAndShowGui() {
        // JPanel used by the main JFrame
        SpeelVeldPanel speelVeldPanel = new SpeelVeldPanel();

        // JPanel used by the main menu JDialog. Pass the above into it
        MainMenuPanel mainMenuPanel = new MainMenuPanel(speelVeldPanel); 

        // create your JFrame
        JFrame frame = new JFrame("Speel Veld");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(speelVeldPanel); // add the JPanel
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);

        // create your non-modal JDialog
        JDialog menuDialog = new JDialog(frame, "Main Menu", ModalityType.MODELESS);
        menuDialog.add(mainMenuPanel); // add the JPanel that holds its "guts"
        menuDialog.pack();
        menuDialog.setLocationByPlatform(true);
        menuDialog.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }
}

您会注意到,如果可以避免的话,我不喜欢扩展JFrame或JDialog。我的感觉是,当需要更大的灵活性时,通过让类扩展JFrame,强迫您创建和显示JFrames,可以将自己描绘成一个角落。更常见的是,您的GUI类将面向创建JPanel,然后可以将JPanel放入JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts进行交换。这将大大提高GUI编码的灵活性

我有两个jframes,一个有点像主菜单

您不应该为此使用2个JFrames。从属子窗口(可能是主菜单窗口)实际上应该是一个JDialog,从外观上看可能是一个非模态对话框

我希望在按下按钮时在级别jframe中更改属性,因此我尝试:

SpeelVeld frame = new SpeelVeld();
    frame.level = 1;
    System.out.println(frame.level);
SpeelVeld frame = new SpeelVeld();
frame.level = 1;
System.out.println(frame.level);
这是一个大问题。请理解,在这段代码中,您正在创建一个新的SpeelVeld对象,重音在单词new上。更改此对象的状态不会影响当前显示的另一个SeelVeld对象。如果执行此操作,第二个窗口将需要对显示的SeelVeld对象的有效引用。如何做到这一点将取决于尚未显示的所有代码,但通常可以通过使用构造函数参数或setter方法将显示的SpeelVeld对象传入主菜单对象来完成

例如:

import java.awt.Dialog.ModalityType;    
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

// JPanel for our main GUI
public class SpeelVeldFoo {

    private static void createAndShowGui() {
        // JPanel used by the main JFrame
        SpeelVeldPanel speelVeldPanel = new SpeelVeldPanel();

        // JPanel used by the main menu JDialog. Pass the above into it
        MainMenuPanel mainMenuPanel = new MainMenuPanel(speelVeldPanel); 

        // create your JFrame
        JFrame frame = new JFrame("Speel Veld");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(speelVeldPanel); // add the JPanel
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);

        // create your non-modal JDialog
        JDialog menuDialog = new JDialog(frame, "Main Menu", ModalityType.MODELESS);
        menuDialog.add(mainMenuPanel); // add the JPanel that holds its "guts"
        menuDialog.pack();
        menuDialog.setLocationByPlatform(true);
        menuDialog.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }
}


您会注意到,如果可以避免的话,我不喜欢扩展JFrame或JDialog。我的感觉是,当需要更大的灵活性时,通过让类扩展JFrame,强迫您创建和显示JFrames,可以将自己描绘成一个角落。更常见的是,您的GUI类将面向创建JPanel,然后可以将JPanel放入JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts进行交换。这将大大提高GUI编码的灵活性

您可能希望JFrame成为顶级容器,然后有一个保存菜单的JPanel。菜单可以是你想要的,我用的是JTextArea。然后,您需要一个用于JPanel或JFrame的JButton,当按下该按钮时,会更改JTextArea中的文本。下面是一个您可以使用的实现。我将ActionEvent用作触发何时处理JTextArea:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class SimpleSwing {
    public static void main(String[] args) {
        JFrame mainFrame = new JFrame();
        JPanel mainMenuPanel = new JPanel();
        JTextArea textAttribute = new JTextArea("Original Text");
        JButton changeAttributeButton = new JButton("Change Attribute");

        changeAttributeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                textAttribute.setText("Whatever new text you want");
            }
        });

        mainMenuPanel.add(textAttribute);
        mainMenuPanel.add(changeAttributeButton);
        mainFrame.add(mainMenuPanel);

        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setSize(500, 500);
        mainFrame.setVisible(true);
    }
}

您可能希望JFrame成为顶级容器,然后有一个保存菜单的JPanel。菜单可以是你想要的,我用的是JTextArea。然后,您需要一个用于JPanel或JFrame的JButton,当按下该按钮时,会更改JTextArea中的文本。下面是一个您可以使用的实现。我将ActionEvent用作触发何时处理JTextArea:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class SimpleSwing {
    public static void main(String[] args) {
        JFrame mainFrame = new JFrame();
        JPanel mainMenuPanel = new JPanel();
        JTextArea textAttribute = new JTextArea("Original Text");
        JButton changeAttributeButton = new JButton("Change Attribute");

        changeAttributeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                textAttribute.setText("Whatever new text you want");
            }
        });

        mainMenuPanel.add(textAttribute);
        mainMenuPanel.add(changeAttributeButton);
        mainFrame.add(mainMenuPanel);

        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setSize(500, 500);
        mainFrame.setVisible(true);
    }
}

我如何用jdialog制作主菜单?@user1806846:无法回答您的具体情况,因为我不知道您是如何创建JFrame的。但是如果是我的代码,我会用谷歌搜索JDialog,检查API和教程,然后创建它。我本来没有主菜单,只有我在主java文件中调用的游戏本身,等等,我会编辑我的问题,你能看一下吗?@user1806846:请看一个示例,其中显示了JFrame、JDialog的创建,这将主GUI与对话框交互联系起来。我如何使用jdialog制作主菜单?@user1806846:无法回答您的具体情况,因为我不知道您是如何创建JFrame的。但是如果是我的代码,我会用谷歌搜索JDialog,检查API和教程,然后创建它。我本来没有主菜单,只有我在主java文件中调用的游戏本身,等等,我会编辑我的问题,你能看一下吗?@user1806846:请看一个示例,其中显示了JFrame、JDialog的创建,这将主GUI与对话框交互连接起来参见