簡體   English   中英

java awt 只有 repaint(),update(),paint() 的問題

[英]java awt only question for repaint(),update(),paint()

這是一個有給定要求的練習。

  • 僅 awt,所以沒有 fx 或 swing
  • 2類首先是帶有2個按鈕繪制和清除的主要
  • 如果按下繪圖按鈕,則隨機繪制一個矩形或圓形
  • 另一個帶有畫布部分的類,我們在其中繪制對象
  • 如果按下清除按鈕,則從對象中清除畫布
  • 兩個類都需要擴展框架

我解決了大部分問題,但我現在有一個問題,清除按鈕有效,繪制按鈕也有效,但問題是我不能一個接一個地繪制多個對象。 如果我繪制一個對象,然后另一個對象由於 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM