Странная графическая ошибка: копия компонента A нарисована на компоненте B. ПОМОГИТЕ!(Джава) - PullRequest
5 голосов
/ 01 августа 2011

Я сделал простую программу рисования, в которой вы можете использовать кисть-инструмент для рисования разных цветов и стирания (просто рисуйте белым).

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

Реализация: фрейм содержит два расширения JPanel: панель инструментов и панель рисования.Панель инструментов содержит два JPanel, которые содержат кнопки цвета и инструментов.Кнопки являются расширениями JComponent.

ссылка на скриншот (я не могу публиковать изображения по-видимому):

enter image description here

примечание: кнопки на втором«Поддельные» панели инструментов - это не настоящие кнопки, на которые можно нажимать, и я могу рисовать поверх них.Если я нарисую цветную кнопку «фальшивка» в левом углу, она будет перекрашена снова, когда я наведу курсор мыши на новый цвет и войду в тянущую панель с помощью мыши.

note 2: Раньше у меня был JMenuBar, который былтакже окрашены в тянущую панель.Она перекрашивалась каждый раз, когда на панель затвора накладывалась мышь после того, как окно (а не только панель) один раз теряло фокус1017 * Метод PaintComponent DrawPanel:

    public void paintComponent(Graphics g) { 
    if(isMousePressed) {
        if(tool == "BRUSH") {
            g.setColor(color);
            g.fillOval(currentEvent.getX(), currentEvent.getY(), 30, 30);
        } else if(tool == "ERASER") {
            g.setColor(getBackground());
            g.fillOval(currentEvent.getX(), currentEvent.getY(), 30, 30);

        }
    }
}

Дайте мне знать, если есть какая-либо соответствующая информация или код, который я пропустил.

Гипотеза: я не вызывал super.paintComponent в DrawPanels paintComponent-метод, может быть, это вызывает некоторые проблемы?Причина, по которой я этого не сделал, заключается в том, что если я это сделаю, он будет постоянно перекрашивать фон, поэтому будет видна только точка, которую я нарисовал последней.Не уверен, что суперзвук действительно решит проблему, или же поддельная панель просто покрыта фоном.Может быть, мне нужно обойти это как-то иначе?Или что-то еще?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 01 августа 2011

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

Вы можете попробовать установить прозрачный компонент (проверьте наличие метода setTransparent или setOpaque), но так как прошло несколько лет, я не уверен, каким будет точный результат.

3 голосов
/ 01 августа 2011

Похоже, вы, вероятно, изменяете объект Graphics вместо создания новых (g.create()) и, следовательно, делаете такие вещи, как установка границ или областей обрезки, которые могут изменить положение рисования.

Если вы можете опубликоватьнемного больше деталей (например, все места, которые вы рисуете) или даже полный SSCCE , тогда я обновлю этот ответ, чтобы быть более конкретным.До тех пор это невозможно.

Рекомендуется всегда создавать новый Graphics объект для работы.

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (isMousePressed) {
        // create the new Graphics context which
        // we can work with/modify independently
        g2 = g.create();
        // use "str".equals() for String comparisons
        if ("BRUSH".equals(tool)) {
            g2.setColor(color);
            g2.fillOval(currentEvent.getX(), currentEvent.getY(), 30, 30);
        } else if ("ERASER".equals(tool)) {
            g2.setColor(getBackground());
            g2.fillOval(currentEvent.getX(), currentEvent.getY(), 30, 30);
        }
        // you should always dispose() of a Graphics
        g2.dispose();
    }
}
...