[英]java awt only question for repaint(),update(),paint()
這是一個有給定要求的練習。
我解決了大部分問題,但我現在有一個問題,清除按鈕有效,繪制按鈕也有效,但問題是我不能一個接一個地繪制多個對象。 如果我繪制一個對象,然后另一個對象由於 repaint() 方法而消失。 我的 2 個想法是覆蓋 update() 或保護 arrayList 中的圖形或其他東西
public class Main extends Frame implements ActionListener {
CanvasPart c;
public static void main(String[] args) {
new Main();
}
public Main() {
super();
setSize and Title....
Button draw = new Button("draw");
Button clear = new Button("clear");
draw.addActionListener(this);
clear.addActionListener(this);
**new Panel and adding buttons**
c = new CanvasPart();
}//Main
@Override
public void actionPerformed(ActionEvent act) {
try {
if(act.getActionCommand().equals("clear")) {
c.clear();
}
if(act.getActionCommand().equals("draw")) {
c.repaint();
}
}catch(Exception exep) {
exep.printStackTrace();
}
}
public class CanvasPart extends Frame{
Canvas canvas = new Canvas();
public DrawFrame() {
**set size location and name ....**
}
@Override
public void paint(Graphics gra) {
super.paint(gra);
Graphics2D gra2D = (Graphics2D) gra;
**pick random rectangle or circle......
and paint them on canvas **
}
public void clear(){
repaint();
}
我希望這個問題是可以理解的。 因為它只是很難找到解決方案或想法。
將您繪制的每個形狀保留在某種List
中,這樣,您可以繼續將形狀添加到列表中,並繼續繪制列表的內容。
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.Panel;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public final class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Frame frame = new Frame();
frame.add(new MainPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class MainPane extends Panel {
private DrawingPane drawingPane;
public MainPane() {
setLayout(new BorderLayout());
Button rectangleButton = new Button("Rectangle");
Button circleButton = new Button("Circle");
Button clearButton = new Button("Clear");
Panel buttonPane = new Panel(new GridBagLayout());
buttonPane.add(rectangleButton);
buttonPane.add(circleButton);
buttonPane.add(clearButton);
rectangleButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
drawingPane.addRectangle();
}
});
circleButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
drawingPane.addCircle();
}
});
clearButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
drawingPane.clear();
}
});
add(buttonPane, BorderLayout.NORTH);
drawingPane = new DrawingPane();
add(drawingPane);
}
}
public class DrawingPane extends Panel {
private List<Shape> shapes = new ArrayList<>();
private Random rnd = new Random();
public DrawingPane() {
}
public void addRectangle() {
int width = rnd.nextInt(getWidth() / 2) + 5;
int height = rnd.nextInt(getWidth() / 2) + 5;
int x = rnd.nextInt(getWidth() - width);
int y = rnd.nextInt(getHeight() - height);
shapes.add(new Rectangle(x, y, width, height));
repaint();
}
public void addCircle() {
int width = rnd.nextInt(getWidth() / 2) + 5;
int height = rnd.nextInt(getWidth() / 2) + 5;
int x = rnd.nextInt(getWidth() - width);
int y = rnd.nextInt(getHeight() - height);
shapes.add(new Ellipse2D.Double(x, y, width, height));
repaint();
}
public void clear() {
shapes.clear();
repaint();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g.create();
for (Shape shape : shapes) {
g2d.draw(shape);
}
}
}
}
nb:我知道,它沒有使用多個Frame
,那是因為這不是一個好主意,而且我是讓你真正做一些工作的泥潭😜
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.