Метод repaint () вызывает появление второго нефункционального JMenuBar? - PullRequest
0 голосов
/ 21 января 2012

Я создаю программу, в которой пользователь может рисовать линии и стирать их. Я могу создать свое окно и создать работающий JMenuBar. Когда возможность рисования не включена, все в порядке. Но когда возможность рисования включена, второй JMenuBar будет нарисован ниже оригинала. Эта строка меню не работает, и иногда при ее прорисовке ВСЕ графические элементы на экране также перекрашиваются ниже. Изменение размера окна любым способом решает эту проблему.

Я бы опубликовал фотографии, но вы знаете, я новый пользователь и не могу.

Мне удалось сузить проблему до точки в моем методе paint (). Необходимо знать: когда мышь перетаскивают, вызывается метод repaint (). Он использует мой метод paint (), который вызывает метод paintObject (Graphics g) в моем классе Line. Ошибка JMenuBar появляется в конце метода рисования в верхнем классе.

public void paint(Graphics g)//paint() in the top class
{            
    for(int i = 0; i < objs.size(); i++)//Loop that finds all Tool(Line) objects that
        ((Tools)objs.get(i)).paintObject(g);//have been drawn, and redraws them.
    //This part of the code completes successfully with no error.

}//ERROR OCCURS HERE!!!!!!

Понятия не имею, почему это происходит. Как примечание, на экране также есть JTextField, который не появляется, пока не будет выделен Спасибо, что хотя бы прочли это далеко!

1 Ответ

2 голосов
/ 21 января 2012

Редактировать: я пойду на конечности, держу пари, что вы на самом деле рисуете прямо в окне верхнего уровня (JFrame или JApplet или JDialog ...) и также добавили слушателя мыши в это окно -- следовательно, чертеж компонентов переведен немного вниз.

Решение состоит в том, чтобы сначала взглянуть на руководства, прежде чем пытаться сделать что-то довольно сложное, как это.Они расскажут вам, как правильно рисовать, включая рекомендации, которые я дал в моих комментариях, такие как рисование в методе JComponent или JPanel paintComponent и вызов метода super.paintComponent (g) в качестве первого вызова метода вашего paintComponentпереопределить.

...