Меню JFrame перетягивается и графика исчезает при изменении размера JFrame

#java #swing #components #jframe #paint

#java #swing #Компоненты #jframe #Краски

Вопрос:

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

Я полагаю, что я перерисовываю меню, потому что я использую графический объект самого JFrame. Однако я не могу найти никаких альтернатив. Я пытался создавать отдельные компоненты для рисования и даже использовать BufferedImage, но ни одна из моих попыток не увенчалась успехом.

Вот мой код:

 import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.*;

public class Paint implements MouseMotionListener{

private JFrame window;
private drawingComponent pComp;
private int xPos; //xPos of mouse;
private int yPos; //yPos of mouse;
private Color color; // new color
private JTextArea sizeBox;

private int brushShape = 0;

public static void main(String[] args) {
    Paint paint = new Paint();
    paint.ImplementGUI();
}

public Paint() {
    this.pComp = new drawingComponent();
    this.window = new JFrame("JPaint");
    this.window.setSize(500, 500);
    this.window.setVisible(true);
    this.window.addMouseMotionListener(this);
    this.window.add(this.pComp);
}

public void ImplementGUI() {
    JMenuBar menu = new JMenuBar();
    JMenu brush = new JMenu("Brush Settings");
    JMenu brushShape = new JMenu("Shape");
    brush.setSize(100,100);
    brush.add(brushShape);
    menu.add(brush);
    menu.setSize(window.getWidth(), 20);
    menu.setVisible(true);

    this.sizeBox = new JTextArea("Brush Size:");
    this.sizeBox.setText("20");
    brush.add(this.sizeBox);

    this.window.setJMenuBar(menu);
}

public void mouseDragged(MouseEvent pMouse) {
    if (pMouse.isShiftDown() == true) {
        this.pComp.paint(this.window.getGraphics(), pMouse.getX(), pMouse.getY(),
                         window.getBackground(), Integer.parseInt(sizeBox.getText()));
    }
    else {
        this.pComp.paint(this.window.getGraphics(), pMouse.getX(), pMouse.getY(),
                         color, Integer.parseInt(sizeBox.getText()));
    }
}

public void mouseMoved(MouseEvent pMouse) {
}

}

class drawingComponent extends JComponent {
    public void paint(Graphics g, int x, int y, Color color, int size) {
        g.setColor(color);
        g.fillOval(x-(size/2), y-(size/2), size, size); // 10 is subtracted from
        // coordinates so the mouse pointer is at the exact middle of the brush.
    }
}
  

Как я могу исправить эту проблему?

Ответ №1:

Никогда не используйте метод getGraphics () для рисования. Как вы заметили, эффект является лишь временным.

Пользовательское рисование выполняется путем переопределения метода paintComponent(), а не метода paint().

Смотрите Пользовательские подходы к рисованию для получения пары примеров того, как рисовать несколько объектов на панели.

Ответ №2:

camickr прав. При изменении размера окна компонент ImplementGUI перерисовывается, поэтому для перерисовки всей поверхности компонента будет вызван ImplementGUI.paintComponent(), и то, что вы нарисовали в mouseDragged(), будет потеряно.