0

我正在尝试使用 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。

如果这是一个初学者问题,请提前感谢您并道歉。我对编程还是很陌生。

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

4

1 回答 1

0

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

在 GridWorld 源代码中,在“GridPanel.java”脚本下,原程序员创建了一个名为“setToolTipsEnabled(boolean flag)”的方法。它的作用是当游戏停止运行时,当光标悬停在网格上时,会在光标旁边弹出一个消息框。

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

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

GridPanel.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;
}
于 2017-10-25T18:46:47.500 回答