Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 跨方法更改变量_Java_Swing_User Interface - Fatal编程技术网

Java 跨方法更改变量

Java 跨方法更改变量,java,swing,user-interface,Java,Swing,User Interface,我已设置GUI,以便在按下按钮b1时: public class CubeCalc { static int next = 0; public static void MakeTitlePage() { final JFrame window = new JFrame("Cubic Feet Calculator"); //Creates Frame JButton b1 = new JButton("Start"); b1.setBackground(Color.d

我已设置GUI,以便在按下按钮
b1
时:

 public class CubeCalc  {

 static int next = 0;

 public static void MakeTitlePage()
 {
  final JFrame window = new JFrame("Cubic Feet Calculator"); //Creates Frame

  JButton b1 = new JButton("Start");
  b1.setBackground(Color.decode("#5A20DF"));
     b1.setForeground(Color.WHITE);
     /*b1.setLayout(new GridBagLayout());*/
     b1.setPreferredSize(new Dimension(150,50));
  b1.addActionListener(new ActionListener() { // action when button is pressed
            int pressCount=0;
            @Override
            public void actionPerformed(ActionEvent e) {

                window.dispose();
               next = 1;


            }
        });
然后,它将处理标题页,并且
next
将等于一,并且在事件调度线程上,它将创建一个执行其他操作的新页面:

public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() { // launch frame on the Event Dispatch Thread
            @Override
            public void run() {
                 MakeTitlePage();

                 if (next==1)
                 {
                   MakeCalcPage();
                 }

                 System.out.println(next);
            }
        });
 }

问题是变量
next
仍然等于零,即使我在方法
MakeTitlePage()
中对其进行了更改。如何在所有方法中更改变量,而不仅仅是该方法?

我想您可能误解了事件分派线程的工作方式。当您向组件添加侦听器时,您告诉Swing侦听某些事件并在事件调度线程上调用关联的侦听器。如果您使用静态变量
next
在线程之间进行通信,那么首先,这不是进行通信的方法,其次,您无论如何都要与同一线程通信

如果希望按钮关闭当前窗口并打开新窗口,则应直接在
actionPerformed
方法中执行此操作:

public void actionPerformed(ActionEvent e) {
    window.setVisible(false);
    showCalculationFrame();
}

我想您可能误解了事件调度线程的工作原理。当您向组件添加侦听器时,您告诉Swing侦听某些事件并在事件调度线程上调用关联的侦听器。如果您使用静态变量
next
在线程之间进行通信,那么首先,这不是进行通信的方法,其次,您无论如何都要与同一线程通信

如果希望按钮关闭当前窗口并打开新窗口,则应直接在
actionPerformed
方法中执行此操作:

public void actionPerformed(ActionEvent e) {
    window.setVisible(false);
    showCalculationFrame();
}

首先,
static
是一个非常糟糕的主意,相反,你应该有某种模型来确定你当前的位置和下一步要做的事情。然后,您将拥有一个控制器,该控制器从UI监视所需的事件,以便它知道何时应该向模型请求下一步并显示它。查看更多详细信息您的核心问题是
JFrame
是非阻塞的,也就是说,一旦显示,代码将继续运行(因此,
next
0
),您可以改用a,但我个人认为,有一些方法让框架生成一个事件返回控制器,并允许它做出所需的决策对于所有这些的概念性示例,首先看一看,
static
是一个非常糟糕的主意,相反,你应该有某种模型来确定你当前的位置和下一步要做的事情。然后,您将拥有一个控制器,该控制器从UI监视所需的事件,以便它知道何时应该向模型请求下一步并显示它。查看更多详细信息您的核心问题是
JFrame
是非阻塞的,也就是说,一旦显示,代码将继续运行(因此,
next
0
),您可以改用a,但我个人认为,有一些方法让框架生成一个事件返回控制器,并允许它做出所需的决策。对于所有这些的概念示例,请看