Я хочу сделать понятный метод, который в основном очищает экран. Я пробовал делать repaint (); который, как я видел, работал в другом коде. Сейчас пытаюсь сделать g.drawRect но он рисует за фоном (как выглядит программа).
Я сделал четкий метод, с помощью которого я попытался изменить цвет фона, который не работал, а затем я попытался создать красный прямоугольник, чтобы закрыть окно, но оба не сработали.
public void clear(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setBackground(Color.RED);
g2d.setColor(Color.RED);
g2d.drawRect(0, 0, 640, 480);
}
@Override
public void paintComponent(Graphics gfx) {
super.paintComponent(gfx);
Graphics2D g = (Graphics2D) gfx;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(Color.BLACK);
g.drawString(welcome, 10, 20);
g.setColor(Color.RED);
g.setStroke(new BasicStroke(2));
for (GeneralPath old_path : old_paths ) {
g.draw(old_path);
}
g.setColor(Color.GREEN);
g.setStroke(new BasicStroke(2));
g.draw(p);
clear(g);
}
Вот полный код:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.GeneralPath;
import java.awt.image.BufferedImage;
import java.util.LinkedList;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Drawing extends JPanel implements MouseListener, MouseMotionListener {
private static final long serialVersionUID = 1L;
GeneralPath p=new GeneralPath();
String welcome = "Welcome";
LinkedList<GeneralPath> old_paths= new LinkedList<GeneralPath>();
public Drawing() {
try
{
setCursor(Toolkit.getDefaultToolkit().createCustomCursor(ImageLoader.loadImage("218.png"),new Point(10,10),"custom cursor"));
}catch(Exception e){}
addMouseListener(this);
addMouseMotionListener(this);
}
public void clear(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setBackground(Color.RED);
g2d.setColor(Color.RED);
g2d.drawRect(0, 0, 640, 480);
}
@Override
public void paintComponent(Graphics gfx) {
super.paintComponent(gfx);
Graphics2D g = (Graphics2D) gfx;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(Color.BLACK);
g.drawString(welcome, 10, 20);
g.setColor(Color.RED);
g.setStroke(new BasicStroke(2));
for (GeneralPath old_path : old_paths ) {
g.draw(old_path);
}
g.setColor(Color.GREEN);
g.setStroke(new BasicStroke(2));
g.draw(p);
clear(g);
}
@Override
public void mouseClicked(MouseEvent event)
{
if (event.getClickCount() == 2) {
System.out.println("clicked");
Graphics g = getGraphics();
clear(g);
g.setColor(Color.RED);
g.drawRect(0, 0, 640, 480);
}
}
@Override
public void mouseEntered(MouseEvent me) {
}
@Override
public void mouseExited(MouseEvent me) {
}
@Override
public void mousePressed(MouseEvent me) {
old_paths.add(p);
p=new GeneralPath();
p.moveTo(me.getX(), me.getY());
repaint();
}
@Override
public void mouseReleased(MouseEvent me) {
}
@Override
public void mouseDragged(MouseEvent me) {
p.lineTo(me.getX(), me.getY());
repaint();
}
@Override
public void mouseMoved(MouseEvent me) {
}
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
frame.setSize(640, 480);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Drawing());
frame.setVisible(true);
}
}




Этот...
if (event.getClickCount() == 2) {
System.out.println("clicked");
Graphics g = getGraphics();
clear(g);
g.setColor(Color.RED);
g.drawRect(0, 0, 640, 480);
}
В Swing рисование работает иначе. Вам нужно остановиться и прочитать Выполнение индивидуальной покраски и Покраска в AWT и Swing, чтобы лучше понять, как работает рисование в Swing.
Одно, очень простое решение может заключаться в том, чтобы просто иметь "очищенную" переменную, которая меняет способ работы paintComponent, например ...
private boolean cleared = false;
@Override
public void paintComponent(Graphics gfx) {
super.paintComponent(gfx);
Graphics2D g = (Graphics2D) gfx;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
if (cleared) {
} else {
g.setColor(Color.BLACK);
g.drawString(welcome, 10, 20);
g.setColor(Color.RED);
g.setStroke(new BasicStroke(2));
for (GeneralPath old_path : old_paths ) {
g.draw(old_path);
}
g.setColor(Color.GREEN);
g.setStroke(new BasicStroke(2));
g.draw(p);
}
}
@Override
public void mouseClicked(MouseEvent event)
{
if (event.getClickCount() == 2) {
cleared = true;
}
}
Однако это несколько усложняет процесс рисования.
Другой подход может заключаться в удалении всех элементов из old_pathsList.
Другой подход может заключаться в использовании BufferedImage в качестве основной поверхности рендеринга, а затем просто нарисовать ее компоненту.