Я сделал простую программу рисования, в которой вы можете использовать кисть, чтобы рисовать разные цвета и стирать (просто рисовать белым).
Он работает нормально, но у меня есть очень странная графическая ошибка, из-за которой панель инструментов и последний наведенный курсором цвет / значок инструмента отображаются поверх панели рисования.
Реализация: фрейм содержит два расширения JPanel: a ToolPanel и DrawPanel. ToolPanel содержит две панели JPanel, которые содержат кнопки цвета и инструментов. Кнопки являются расширениями JComponent.
ссылка на снимок экрана (по-видимому, мне не разрешено публиковать изображения):
примечание:Кнопки на второй «фальшивой» панели инструментов не являются настоящими кнопками, на которые можно нажимать, и я могу рисовать поверх них. Если я закрашу "фальшивую" цветную кнопку в левом углу, она будет перекрашена снова, когда я наведу курсор на новый цвет и войду в панель рисования с помощью мыши.
примечание 2: Раньше у меня был JMenuBar, который также был окрашен в выдвижная панель. Он перекрашивался каждый раз, когда панель рисования наводилась мышью после того, как окно (а не только панель) теряло фокус однажды.
Некоторый код: (Я знаю, что реализация выбора инструмента не самая лучшая: P)
Метод 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 в методе PaintComponent DrawPanels, может это вызывает проблемы? Причина, по которой я этого не сделал, заключается в том, что в этом случае фон будет постоянно перерисовываться, поэтому будет видна только точка, которую я нарисовал последней. Не уверен, действительно ли супервызов решает проблему или поддельная панель также просто закрывается фоном. Может мне нужно как-то обойти это? Или что-то еще?
Спасибо!