【问题标题】:How to Refresh a JFrame如何刷新 JFrame
【发布时间】:2021-06-18 21:34:27
【问题描述】:

所以我想做某种井字游戏,我不确定我的其余代码是否正确(我显然还没有完成)但我认为问题在于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] = " ";
 }}

package pack1;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class KeyListiner implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource()==Var.button1);
    
     
     System.out.println(Var.a);
     Var.a= 0 ;
     
}
}

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

【问题讨论】:

  • 请更新您的问题以说明问题所在。
  • 为来的状态创建模型。添加一个接受GameModel 并更新组件的内容/状态以匹配模型的方法。当需要刷新时,创建一个空白初始模型并调用该方法。 一般提示: 1) 为尽快获得更好的帮助,edit 添加minimal reproducible exampleShort, Self Contained, Correct Example。硬编码数据替换数据库。 2) 请学习常见的 Java 命名法(命名约定 - 例如EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttribute,除非它是 UPPER_CASE_CONSTANT)..
  • .. 并始终如一地使用它。 3) 源代码中的一个空白行是永远需要的。 { 之后或} 之前的空行通常也是多余的。 4) 使用逻辑一致的形式缩进代码行和块。缩进是为了让代码流更容易理解!大多数 IDE 都有专门用于格式化代码的键盘快捷键。 5) static JFrame jf; 不要制作组件或窗口 static 除非你能证明为什么它们必须是静态的。它通常导致的问题多于解决的问题。
  • .. 6) public class KeyListiner implements ActionListener { 为类、方法和属性使用有意义且相关的名称。还要避免误导名称。这是一个很好的例子。有一个像KeyListener 这样的东西,它监听.. 的击键。 ActionListener 用于在按钮、菜单或文本字段等“可操作”组件上进行键盘或鼠标操作。

标签: java swing jframe


【解决方案1】:

您可能有多个按钮,但其中只有一个具有按键侦听器。 这意味着您必须将焦点移至一个按钮并按下一个键。 棘手的是 UI 并没有表明这样的限制。

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

如果你想在 UI 更新时继续做你的事情,你需要创建自己的线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2013-02-22
    • 2013-05-05
    • 2015-12-18
    • 1970-01-01
    相关资源
    最近更新 更多