有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaG.drawRect在背景后面绘制矩形

我想制定一个清晰的方法,基本上可以清除屏幕。我试着重新油漆;我看到它在另一个代码中工作。现在我试图做g.drawRect,但它把它画在背景后面(what the program looks like

我制定了一个明确的方法,我试图改变背景色,但没有效果,然后我试图制作一个红色矩形来覆盖窗口,但两者都没有效果

    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);
    }
}

共 (1) 个答案

  1. # 1 楼答案

    这个

    if (event.getClickCount() == 2) {
          System.out.println("clicked");
          Graphics g = getGraphics();
    
          clear(g);
          g.setColor(Color.RED);
          g.drawRect(0, 0, 640, 480);
    
    
      }
    

    这不是绘画在摇摆中的表现。你需要停下来,通读一遍Performing Custom PaintingPainting in AWT and Swing,以便更好地理解绘画是如何在摇摆中工作的

    一个非常简单的解决方案可能是简单地使用一个“cleared”变量,它可以改变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_paths{}中删除所有元素

    另一种方法可能是使用BufferedImage作为主要渲染表面,然后简单地将其绘制到组件上