2017-05-09 1 views
0

Ich versuche, ein einfaches Menü für ein kleines Projekt mit einem JSpinner und JOptionPane zu erstellen. Ich habe meine gewünschte Ausgabe, aber wenn ich mit dem Fenster interagieren oder sogar über die Schaltflächen im Feld schweben, schafft sie visuelle Artefakte immer und immer wieder (siehe Bilder unten):Java JOptionPane Visual Artefakt von Fensterinteraktion

JOptionPane before mouse hover

JOptionPane after mouse hover

Ich habe etwas recherchiert und dachte, es könnte daran liegen, dass JOptionPane nicht threadsicher ist, aber nichts zum Laufen bringen konnte.

Insgesamt ist meine spezifische Frage wie kann ich verhindern, dass Java diese visuellen Artefakte über mein JOptionPane-Fenster neu streichen?

Als Referenz finden Sie in die Methode, die ich dieses Menü zu zeigen, bin mit:

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); 
    } 
} 

Ich verwende diesen Code auf BlueJ und ist mit Windows-10 Pro.

Vielen Dank im Voraus und Entschuldigung, wenn dies eine Anfängerfrage ist. Ich bin noch ziemlich neu im Programmieren.

EDIT: Aktualisierter Code, um vollständige Quelle des Problems zu geben, aber es verschwand. Ich werde es im Auge behalten, um zu sehen, wo die Fehlerquelle zuerst aufgetreten ist.

+1

Posting 4 Zeilen Code hilft uns nicht. Veröffentlichen Sie eine ordnungsgemäße [mcve], die das Problem veranschaulicht. Das ist nach Ihrer Beschreibung des Problems alles, was Sie brauchen, ist ein Optionsfeld mit einem Drehfeld und natürlich eine main() -Methode, um das Optionsfenster anzuzeigen. Wahrscheinlichkeiten sind beim Erstellen des Beispiels, das Sie das Problem finden werden. – camickr

+1

Ich habe meinen Code umstrukturiert, um ein richtiges Beispiel zu liefern, aber jetzt ist der Fehler verschwunden. Selbst das Neustarten meines Programms hat das Problem verschwinden lassen. Ich werde es im Auge behalten, während ich mein Programm entwickle, um zu sehen, ob das Problem wieder auftaucht. Danke für Ihre Rückmeldung. Es hat mir geholfen, dieses Problem zu verringern und wird mir helfen, in Zukunft bessere Fragen zu stellen. – Phillip

Antwort

0

Nachdem ich mein Projekt abgeschlossen hatte, fand ich schließlich, warum visuelle Artefakte in allen Knöpfen/Radioknöpfen/etc auftauchen würden. in meinem Spiel.

Im GridWorld-Quellcode erstellten die ursprünglichen Programmierer unter dem Skript "GridPanel.java" eine Methode namens "setToolTipsEnabled (boolean flag)". Seine Funktion besteht darin, ein Meldungsfeld neben dem Cursor zu öffnen, wenn es sich über dem Gitter befindet, wenn das Spiel nicht mehr läuft.

Beim Erweitern von GridWorld zum Erstellen meines Projekts reicht die Methode über die Gitterstruktur hinaus und versucht, eine Werkzeugspitze unterhalb des Mauszeigers zu erstellen. So erzeugen Sie visuelle Artefakte auf Schaltflächen/Optionsfeldern/etc.

Um dies zu beheben, stellte ich sicher, dass diese Methode immer auf false gesetzt war, da ich sowieso keine Tooltips für mein Spiel benötigte. Diese Methode wurde in den Skripten "GridPanel.java" und "GUIController.java" (im GridWorld-Code) implementiert. Ich änderte Methoden folgende dieses Problem zu beheben:

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

Alternativ könnten die Methodenaufrufe vollständig weggelassen werden, aber ich bemerkte sie im Falle heraus Ich brauchte sie in der Zukunft.

Zur Bezugnahme stellt das Verfahren unter den Werkzeugspitzen Sichtbarkeit in Gridworld (befindet sich in "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; 
}