gpt4 book ai didi

java - 当在另一个 JFrame 中单击按钮时更改其他 jframe 中的属性

转载 作者:行者123 更新时间:2023-12-01 18:05:54 24 4
gpt4 key购买 nike

我有 2 个 jframe,其中 1 个有点像主菜单,我希望按下按钮时在级别 jframe 中更改一个属性,所以我尝试了:

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 文件的 main 方法。

如何制作 jdialog

最佳答案

I have 2 jframes, 1 is kinda like the main menu,

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

I want an attribute to change in the level jframe when a button is pressed so i tried:

SpeelVeld frame = new SpeelVeld();
frame.level = 1;
System.out.println(frame.level);

这是一个大问题。请注意,在此代码中,您将创建一个new 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();
});
}
}

@SuppressWarnings("serial")
class SpeelVeldPanel extends JPanel {
private int level = 1; // simple example just has a level int
private JLabel levelLabel = new JLabel("1"); // and displays it in a JLabel

public SpeelVeldPanel() {
add(new JLabel("Level:"));
add(levelLabel);

int ebGap = 50;
setBorder(BorderFactory.createEmptyBorder(ebGap, 2 * ebGap, ebGap, 2 * ebGap));
}

public int getLevel() {
return level;
}

public void setLevel(int level) {
// whenever level is changed, update the display
this.level = level;
levelLabel.setText(String.valueOf(level));
}
}

// class for the JPanel held by the JDialog
@SuppressWarnings("serial")
class MainMenuPanel extends JPanel {
private JSpinner levelSpinner = new JSpinner(new SpinnerNumberModel(1, 1, 5, 1));
private SpeelVeldPanel speelVeldPanel = null; // reference to the main GUI

// note the parameter.... you pass in the displayed main GUI so you can
// change it
public MainMenuPanel(final SpeelVeldPanel speelVeldPanel) {
this.speelVeldPanel = speelVeldPanel; // set the field

// respond when the spinner's data changes
levelSpinner.addChangeListener(new LevelListener());

add(new JLabel("Set the Speel Veld's level:"));
add(levelSpinner);

int ebGap = 10;
setBorder(BorderFactory.createEmptyBorder(ebGap, ebGap, ebGap, ebGap));
}

private class LevelListener implements ChangeListener {

@Override
public void stateChanged(ChangeEvent e) {
// when the spinner's data changes
int level = (int) levelSpinner.getValue(); // get the data
speelVeldPanel.setLevel(level); // and send it to the main GUI
}
}
}

您会注意到,如果可以避免的话,我不喜欢扩展 JFrame 或 JDialog。我的感觉是,如果让您的类扩展 JFrame,迫使您创建和显示 JFrame,那么当通常需要更大的灵 active 时,您可能会将自己陷入困境。更常见的是,您的 GUI 类将适合创建 JPanel,然后可以将其放入 JFrame 或 JDialogs 或 JTabbedPanes 中,或者在需要的地方通过 CardLayout 进行交换。这将大大增加 GUI 编码的灵 active 。

关于java - 当在另一个 JFrame 中单击按钮时更改其他 jframe 中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36433646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com