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

时间:2016-04-05 17:56:15

标签: java swing 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文件的主要方法。

我如何制作jdialog

2 个答案:

答案 0 :(得分:3)

  

我有2个jframe,1个有点像主菜单,

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

  

我希望在按下按钮时在jframe级别更改属性,所以我尝试了:

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();
        });
    }
}

@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或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts交换。这将大大提高GUI编码的灵活性。

答案 1 :(得分:1)

您可能希望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);
    }
}