Визуальный артефакт Java JOptionPane от взаимодействия с окном

Я пытаюсь создать простое меню для небольшого проекта, используя 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.

Заранее спасибо и извините, если это вопрос новичка. Я все еще довольно новичок в программировании.

РЕДАКТИРОВАТЬ: Обновлен код, чтобы указать полный источник проблемы, но он исчез. Я буду следить за этим, чтобы увидеть, где впервые появился источник ошибки.


person Phillip    schedule 09.05.2017    source источник
comment
Публикация 4 строк кода нам не поможет. Опубликуйте правильный минимально воспроизводимый пример, демонстрирующий проблему. То есть, согласно вашему описанию проблемы, все, что вам нужно, это панель параметров со счетчиком и, конечно же, метод main() для отображения панели параметров. Скорее всего, при создании примера вы обнаружите проблему.   -  person camickr    schedule 09.05.2017
comment
Я реструктурировал свой код, чтобы предоставить правильный пример, но теперь ошибка исчезла. Даже перезапуск моей программы заставил проблему исчезнуть. Я буду следить за этим, когда буду разрабатывать свою программу, чтобы увидеть, не возникнет ли проблема снова. Спасибо за ваш отзыв. Это помогло мне сузить круг этой проблемы и поможет мне лучше задавать вопросы в будущем.   -  person Phillip    schedule 09.05.2017


Ответы (1)


После завершения моего проекта я, наконец, обнаружил, почему визуальные артефакты появляются на всех кнопках/переключателях/и т. д. в моей игре.

В исходном коде GridWorld в сценарии «GridPanel.java» первоначальные программисты создали метод с именем «setToolTipsEnabled (логический флаг)». Его функция состоит в том, чтобы отображать окно сообщения рядом с курсором, когда он зависает над сеткой, когда игра перестает работать.

При расширении 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;
}
person Phillip    schedule 25.10.2017