Java 设置程序未更新变量

Java 设置程序未更新变量,java,swing,actionlistener,setter,Java,Swing,Actionlistener,Setter,我正在创建一个俄罗斯方块游戏,希望用户能够从3种不同的大小中选择自己的棋盘大小。我有一个板后端处理右,左,下,下降运动,我有一个板图形用户界面,创建形状和动画它。因此,当更新大小时,我需要同时更新主板的后端和GUI。我的大小不断被初始化回10 x 20,这是默认大小 这是我的BoadGUI代码片段(我删除了所有不必要的代码,我可能遗漏了一些东西,对不起) 这是我设置大小的主GUI private int myWidth; private int myHeight; public MainGU

我正在创建一个俄罗斯方块游戏,希望用户能够从3种不同的大小中选择自己的棋盘大小。我有一个板后端处理右,左,下,下降运动,我有一个板图形用户界面,创建形状和动画它。因此,当更新大小时,我需要同时更新主板的后端和GUI。我的大小不断被初始化回10 x 20,这是默认大小

这是我的BoadGUI代码片段(我删除了所有不必要的代码,我可能遗漏了一些东西,对不起)

这是我设置大小的主GUI

private int myWidth;
private int myHeight;


public MainGUI() {
    super();
    myWidth = 10;
    myHeight = 20;

}

/**
 * 
 */
private static final long serialVersionUID = -5056050661369885282L;
private JMenuBar myMenuBar;
public void start() {
    setTitle("Tetris");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    myEastPanel = new JPanel(new BorderLayout());

    NextPiece nextPanel = new NextPiece();
    myBoardGUI = new BoardGUI(this, myWidth, myHeight);
    myMainBoard = myBoardGUI.getBoard();
    setResizable(false);

    pack();
    setLocationRelativeTo(null);
    setVisible(true);
 }
 public JMenuBar createMenuBar() {
    myMenuBar = new JMenuBar();
    myWindow = new JMenu("Window");
    final JFrame frame = this;
    myMenuBar.add(myWindow);
    setWindowSize();
    myMenuBar.setVisible(true);

    return myMenuBar;


}
private void setWindowSize() {
    ButtonGroup group = new ButtonGroup();
    JCheckBox def = new JCheckBox("Default");
    JCheckBox size1 = new JCheckBox("150 x 250");
    myWindow.add(def);
    myWindow.addSeparator();
    myWindow.add(size1);
    group.add(def);
    group.add(size1);
    JFrame frame = this;
    def.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {

            myWidth = 10;
            myHeight = 20;
             myBoardGUI.setPanelSize(myWidth,myHeight); //setting here

        }

    });
    size1.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
           // myBoardGUI.setPanelSize(15, 25);
            myWidth = 15;
            myHeight = 25;
            myBoardGUI.setPanelSize(myWidth,myHeight); // Setting here


        }

    });
}

保存变量,但从不重置首选大小

this.setPreferredSize(new Dimension(myWidth * BLOCK_WIDTH,  myHeight * BLOCK_WIDTH)); 
问题是您不应该使用setPreferredSize()方法。这使得大小固定而不是动态

相反,您应该覆盖面板的
getPreferredSize()
方法。比如:

@Override
public Dimension getPreferredSize()
{
    return new Dimension(myWidth * BLOCK_WIDTH,  myHeight * BLOCK_WIDTH)); 
}
这将允许在Swing需要时动态计算大小

更新需要调用的变量后,现在在
面板.setSize()方法中:

revalidate();
repaint();

因此,可以调用布局管理器并考虑面板的新大小。

保存变量,但从不重置首选大小

this.setPreferredSize(new Dimension(myWidth * BLOCK_WIDTH,  myHeight * BLOCK_WIDTH)); 
问题是您不应该使用setPreferredSize()方法。这使得大小固定而不是动态

相反,您应该覆盖面板的
getPreferredSize()
方法。比如:

@Override
public Dimension getPreferredSize()
{
    return new Dimension(myWidth * BLOCK_WIDTH,  myHeight * BLOCK_WIDTH)); 
}
这将允许在Swing需要时动态计算大小

更新需要调用的变量后,现在在
面板.setSize()方法中:

revalidate();
repaint();

因此,可以调用布局管理器,并考虑面板的新尺寸。

如果您可以创建并发布一个有效的(请阅读链接了解此有用工具的重要细节),我们将非常高兴(您也可以,因为这可能会帮助您快速获得答案),我们可以运行一个,测试和修改。如果您可以创建并发布一个有效的(请阅读链接了解此有用工具的重要细节),我们可以运行、测试和修改该工具,这对我们(以及您,因为这可能会帮助您快速获得答案)将是非常好的。