- Java code
import javax.swing.SwingUtilities;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.BorderFactory;import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseMotionListener;import java.awt.event.MouseMotionAdapter;public class SwingPaintDemo3 { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } private static void createAndShowGUI() { System.out.println("Created GUI on EDT? " + SwingUtilities.isEventDispatchThread()); JFrame f = new JFrame("Swing Paint Demo"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(new MyPanel()); f.pack(); f.setVisible(true); }}class MyPanel extends JPanel { private int squareX = 50; private int squareY = 50; private int squareW = 20; private int squareH = 20; public MyPanel() { setBorder(BorderFactory.createLineBorder(Color.black)); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { moveSquare(e.getX(), e.getY()); } }); addMouseMotionListener(new MouseAdapter() { public void mouseDragged(MouseEvent e) { moveSquare(e.getX(), e.getY()); } }); } private void moveSquare(int x, int y) { int OFFSET = 1; if ((squareX != x) || (squareY != y)) { repaint(squareX, squareY, squareW + OFFSET, squareH + OFFSET); squareX = x; squareY = y; repaint(squareX, squareY, squareW + OFFSET, squareH + OFFSET); } } public Dimension getPreferredSize() { return new Dimension(250, 200); } protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawString("This is my custom Panel!", 10, 20); g.setColor(Color.RED); g.fillRect(squareX, squareY, squareW, squareH); g.setColor(Color.BLACK); g.drawRect(squareX, squareY, squareW, squareH); }}
直接上了代码 问题是moveSquare方法为什么要调用两次的repaint方法呢? super.paintComponent方法上网查了下说是可以清除所有东西 那moveSquare方法的第一个repaint方法不是多余的了吗? 不解啊。。。。
------解决方案--------------------
我记得是画背景的