我在Swing Java中的Paint-Repaint机制遇到了问题。
我希望创建一个GraphicEditor,可以使用鼠标创建矩形和形状。
应用程序应该像这样:
我的代码如下:
public class MiniGrafikEditor extends JFrame implements ActionListener {
private Vector rectList;
private Rectangle currentRect;
private Color color = Color.green;
private static int v = 0 ;
JPanel bp;
public static void main(String[] args) {
MiniGrafikEditor wnd = new MiniGrafikEditor();
}
public MiniGrafikEditor() {
super("Rechtecke zeichnen");
rectList = new Vector();
currentRect = new Rectangle(0, 0, 0, 0);
setLayout(new BorderLayout());
addWindowListener(new MyWindowListener());
addMouseListener(new MyMouseListener());
addMouseMotionListener(new MyMouseMotionListener());
bp = new JPanel();
bp.setBackground(Color.gray);
add("North", bp);
JRadioButton b = null;
bp.add(b = new JRadioButton("Rechteck"));
b.addActionListener(this);
bp.add(b = new JRadioButton("kreis"));
b.addActionListener(this);
bp.add(b = new JRadioButton("Standard"));
b.addActionListener(this);
setLocation(200, 200);
setSize(400, 300);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
String label = ((JRadioButton) e.getSource()).getLabel();
bp.repaint();
if (label.equals("Rechteck")) {
v=1;
bp.repaint();
}
if (label.equals("Blue")) {
color = Color.blue;
bp.repaint();
}
Graphics g = getGraphics();
drawRects(g);
}
public void drawRects(Graphics g) {
Rectangle r;
Enumeration e;
g.clearRect(0, 0, getSize().width, getSize().height);
g.setColor(color);
for (e = rectList.elements(); e.hasMoreElements();) {
r = (Rectangle) e.nextElement();
g.drawRect(r.x, r.y, r.width, r.height);
}
if (currentRect != null && (currentRect.x > 0 || currentRect.y > 0)) {
g.drawRect(currentRect.x, currentRect.y, currentRect.width,
currentRect.height);
}
bp.repaint();
}
class MyMouseListener extends MouseAdapter {
public void mousePressed(MouseEvent event) {
bp.repaint();
if(v==1){
currentRect = new Rectangle(event.getX(), event.getY(), 0, 0);
}
}
public void mouseReleased(MouseEvent event) {
if(v==1){
if (currentRect.width > 0 || currentRect.height > 0) {
rectList.addElement(currentRect);
currentRect = null;
}
Graphics g = getGraphics();
drawRects(g);
}
bp.repaint();
}
}
class MyMouseMotionListener extends MouseMotionAdapter {
public void mouseDragged(MouseEvent event) {
if(v==1){
int x = event.getX();
int y = event.getY();
if (x > currentRect.x && y > currentRect.y) {
currentRect.width = x - currentRect.x;
currentRect.height = y - currentRect.y;
}
Graphics g = getGraphics();
drawRects(g);
}
}
}
class MyWindowListener extends WindowAdapter {
public void windowClosing(WindowEvent event) {
setVisible(false);
dispose();
System.exit(0);
}
}
}
当我运行应用程序时,它看起来像这样: 当我尝试绘制一个矩形时,我可以看到Jpanel在重新绘制时。
如何重新绘制Jpanel以便我看不见它,当它重新绘制时。
非常感谢您的帮助。