如何刷新 JFrame

问题描述

所以我想做某种 Tic tac toe,我不确定我的其余代码是否正确(我显然还没有完成)但我认为问题在于 {{1 }} 不刷新,我不知道该怎么做,所以如何刷新框架?

JFrame

package pack1;

import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Gui {


public  Gui() {
     Var.jf = new JFrame();
      Var.jf.setSize(Var.screenwidth,Var.screenheight);

      Var.button1 = new JButton(Var.arr[Var.a]);
      Var.jf.add(Var.button1);
      Var.button2 = new JButton(Var.arr[Var.b]);
      Var.jf.add(Var.button2);
      Var.button3 = new JButton(Var.arr[Var.c]);
      Var.jf.add(Var.button3);
      Var.button4 = new JButton(Var.arr[Var.d]);
      Var.jf.add(Var.button4);
      Var.button5 = new JButton(Var.arr[Var.e]);
      Var.jf.add(Var.button5);
      Var.button6 = new JButton(Var.arr[Var.f]);
      Var.jf.add(Var.button6);
      Var.button7 = new JButton(Var.arr[Var.g]);
      Var.jf.add(Var.button7);
      Var.button8 = new JButton(Var.arr[Var.h]);
      Var.jf.add(Var.button8);
      Var.button9 = new JButton(Var.arr[Var.i]);
      Var.jf.add(Var.button9);
      Var.jf.setLayout(new GridLayout(3,3,10,10));
      Var.button1.addActionListener(new KeyListiner());

      Var.jf.setTitle("Tic tac toe");
      Var.jf.setVisible(true);
      Var.jf.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
      Var.jf.setLayout(null);
      Var.jf.setLocationRelativeto(null);
      Var.jf.setResizable(false);
   }
}

 package pack1;

 import javax.swing.*;

 public class Var {
 static JFrame jf;
 static JButton button1;
 static JButton button2;
 static JButton button3;
 static JButton button4;
 static JButton button5;
 static JButton button6;
 static JButton button7;
 static JButton button8;
 static JButton button9;
 static  int a = 2;
 static  int b = 2;
 static int c = 2;
 static int d = 2;
 static int e = 2;
 static int f = 2;
 static int g = 2;
 static int h = 2;
 static int i = 2;

 static int screenwidth = 900,screenheight = 900;
 static String[]arr = new String[3];{

 arr[0] = "X";
 arr[1] = "O";
 arr[2] = " ";
 }}

如果我没有正确解释某些事情或类似的事情,请告诉我。

解决方法

您可能有多个按钮,但其中任何一个都有一个键侦听器。 这意味着您必须将焦点移到一个按钮上并按下一个键。 棘手,因为 UI 并不表示这种限制。

尝试用事件驱动的方法来解决这个问题。将 ActionListener 附加到每个按钮。在这个 actionlistener 中,您可以根据需要更改板,然后调用 repaint() 方法(它不会真正重绘,而是标记要重绘的组件),然后退出您的方法。除非您退出在 Event Dispatcher Thread 上运行的方法,否则不会发生 UI 更新。

如果您想在 UI 更新时继续做您的工作,您需要创建自己的线程。