2017-05-09 88 views
0

我想为使用JSpinner和JOptionPane的小项目创建一个简单的菜单。我创建了所需的输出,但是当我与窗口交互,甚至超过在框中的按钮徘徊,一遍又一遍产生视觉假象再次(见下面的图片):Java JOptionPane来自窗口交互的视觉神器

JOptionPane before mouse hover

JOptionPane after mouse hover

我做了一些研究,并认为它可能是由于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专业版。

如果这是一个初学者问题,请提前致谢并表示歉意。我对编程还很陌生。

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

+1

发布4行代码并不能帮助我们。发布一个证明问题的适当的[mcve]。这是根据你对问题的描述,你所需要的只是一个带微调控制器的选项面板,当然还有一个显示选项面板的main()方法。在创建例子时你会发现问题的机会。 – camickr

+1

我重构了我的代码以提供一个合适的示例,但现在错误消失了。即使重新启动我的程序也会使问题消失。当我开发我的程序以查看问题是否再次出现时,我会继续关注它。感谢您的反馈意见。它帮助我缩小了这个问题的范围,并将帮助我在未来提出更好的问题。 – Phillip

回答

0

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

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

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

为了解决这个问题,我确定这个方法总是设置为false,因为我不需要我的游戏的工具提示。该方法在“GridPanel.java”和“GUIController.java”脚本中实现(在GridWorld代码中)。我改变了下面的方法来解决这个问题:

/** 
* 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; 
} 

或者

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,方法调用可以被完全省略,但是我的情况下,注释出来我将来需要他们。

仅供参考,下面的方法将在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; 
}