gpt4 book ai didi

java - 使用Jpanel、repaint()方法在类之间进行通信

转载 作者:行者123 更新时间:2023-11-30 04:03:20 53 4
gpt4 key购买 nike

我有一个扩展 JPanel 的“GUI”类。我有另一个扩展 JFrame 的“Buttons”类。当 JButton“clearB”被推到 JFrame 上时,我试图让 JFrame 类调用 JPanel 类中的方法“clearScreen()”。我可以完成这项工作的唯一方法是在 JButton 的 Action 监听器中构建 JPanel 类“GUI”的对象:

clearB.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent event){
GUI g = new GUI();
g.clearScreen();

}
}
);

但是当我调用clearScreen()方法时,它看起来像这样:

public void clearScreen(){
xs.clear();
ys.clear();
count = 0;
repaint();
}

什么也没发生。我猜这是因为 repaint() 方法由于某种我未知的原因而不起作用。请有人向我展示一种更简单、更有效的方法来完成我在这里想要完成的任务。谢谢! :D

最佳答案

您的 ActionListener 无法工作的原因是因为您在其中创建的 GUI 对象是一个新的 GUI 对象,该对象与显示的 GUI 对象完全无关,所以在非显示的 GUI 实例上调用 clearScreen() 方法不会对显示的 GUI 实例产生任何影响。

解决方案是让您的 Buttons 类保存对可视化 GUI 对象的有效引用,并调用该引用的方法。可以通过 setter 方法或构造函数参数传递引用。

即,

public class Buttons {
private GUI gui;

public Buttons (GUI gui) {
this.gui = gui;
}

// in some ActionListener code...
gui.someMethod();
}

一些评论:

  • 您必须有一个扩展 JFrame 的类是不寻常的。就我个人而言,除非必要,否则我会尽量避免这样做,而是通常从 JFrame 类本身创建 JFrame,并且仅在需要时才创建。
  • 令我有点惊讶的是,您的主窗口类还没有 GUI 变量,因为它可能会显示 GUI 实例。

关于java - 使用Jpanel、repaint()方法在类之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21447020/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com