Change attribute in other jframe when a button is clicked in another JFrame(单击其他JFrame中的按钮时更改其他JFrame中的属性)
问题描述
我有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
推荐答案
我有2个jframe,1有点像主菜单
您不应该为此使用2个JFrame。依赖子窗口(很可能是您的主菜单窗口)实际上应该是一个JDialog,从外观上看可能是一个非模式对话框。
我希望在按下按钮时更改级别jframe中的属性,因此我尝试了:
SpeelVeld frame = new SpeelVeld(); frame.level = 1; System.out.println(frame.level);
这是个大问题。请理解,在此代码中,您正在创建一个newSpeelVeld对象,重音放在单词new上。更改此对象的状态不会影响当前显示的其他SeelVeld对象。请执行此操作,您的第二个窗口将需要对显示的SeelVeld对象的有效引用。如何做到这一点将完全取决于尚未显示的代码,但通常只需使用构造函数参数或setter方法将显示的SpeelVeld对象传递到Main Menu对象即可完成。
例如:
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,而通常需要更大的灵活性,这样就可以把自己逼入绝境。更常见的情况是,您的GUI类将用于创建JPanels,然后可以将其放置到JFrames或JDialog或JTabbedPanes中,或者在需要的任何地方通过CardLayout进行交换。这将极大地提高GUI编码的灵活性。
这篇关于单击其他JFrame中的按钮时更改其他JFrame中的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:单击其他JFrame中的按钮时更改其他JFrame中的属性
基础教程推荐
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01