Java JOptionPane Visual Artifact from Window Interaction



我正在尝试使用JSpinner和JOptionPane为一个小项目创建一个简单的菜单。 我创建了所需的输出,但是当我与窗互甚至将鼠标悬停在框中的按钮上时,它会一遍又一遍地创建视觉伪影(见下图):

鼠标悬停前的 JOptionPane

鼠标悬停后的 JOptionPane

我做了一些研究,认为这可能是由于 JOptionPane 不是线程安全的,但无法让任何东西工作。

总的来说,我的具体问题是我如何防止Java在我的JOptionPane窗口中重新绘制这些视觉工件?

有关参考,请参阅我用于显示此菜单的方法:

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SpinnerNumberModel;
import javax.swing.JSpinner;
public class Battleship
{
public static void main(String[] args)
{
SpinnerNumberModel battleshipRange = new SpinnerNumberModel(1, 1, 5, 1);
JSpinner rangeSpinner = new JSpinner(battleshipRange);
JOptionPane.showMessageDialog(null, rangeSpinner, "Battleship Number", JOptionPane.QUESTION_MESSAGE);
}
}

我在BlueJ上运行此代码,并且正在使用Windows 10 Pro。

提前感谢您,如果这是一个初学者问题,我们深表歉意。 我对编程还很陌生。

编辑:更新了代码以提供完整的问题来源,但它消失了。 我会密切关注它,看看错误的来源最初发生在哪里。

完成我的项目后,我终于找到了为什么视觉伪影会在游戏中的所有按钮/单选按钮/等中弹出。

在GridWorld源代码中,在"GridPanel.java"脚本下,原始程序员创建了一个名为"setToolTipsEnabled(布尔标志)"的方法。 它的功能是在游戏停止运行时将鼠标悬停在网格上时,在光标旁边弹出一个消息框。

扩展 GridWorld 以创建我的项目时,该方法会越过网格结构,并尝试在光标悬停的任何内容下方创建工具提示。 因此,在按钮/单选按钮/等上创建视觉工件。

为了解决这个问题,我确保此方法始终设置为 false,因为我的游戏无论如何都不需要工具提示。 此方法在"GridPanel.java"和"GUIController.java"脚本(在GridWorld代码中)中实现。 我更改了以下方法来解决此问题:

网格面板.java

/**
* Construct a new GridPanel object with no grid. The view will be
* empty.
*/
public GridPanel(DisplayMap map, ResourceBundle res)
{
displayMap = map;
resources = res;
// Phillip Sturtevant: Commented out to prevent visual artifacts
//setToolTipsEnabled(true);
}

GUIController.java

/**
* Stops any existing timer currently carrying out steps.
* Phillip Sturtevant Note: keep tool tips hidden to prevent visual artifacts
*/
public void stop()
{
display.setToolTipsEnabled(false); // hide tool tips while stopped
timer.stop();
running = false;
}

或者,可以完全省略方法调用,但我将它们注释掉,以防将来需要它们。

作为参考,下面的方法在 GridWorld 中设置工具提示可见性(位于"GridPanel.java"中):

/**
* Enables/disables showing of tooltip giving information about the
* occupant beneath the mouse.
* @param flag true/false to enable/disable tool tips
*/
public void setToolTipsEnabled(boolean flag)
{
if ("hide".equals(System.getProperty("gridworld.gui.tooltips")))
flag = false;
if (flag)
ToolTipManager.sharedInstance().registerComponent(this);
else
ToolTipManager.sharedInstance().unregisterComponent(this);
toolTipsEnabled = flag;
}

最新更新