簡體   English   中英

無法在JPanel上繪制橢圓形

[英]Can't draw oval on JPanel

當我點擊鼠標時,我正試圖在JPanel上繪制橢圓。 我的代碼不調用paintComponent,因此JPanel上沒有任何操作。 哪個部分我不見了?

 public class Main extends JFrame implements MouseListener{
        JPanel thePanel = new JPanel(){
            @Override
             protected void paintComponent(Graphics g)
               {
                  super.paintComponent(g);
                g.setColor(Color.red);
                for (Circle c : circles){
                      g.fillOval(c.x, c.y, c.diameter, c.diameter);
                      System.out.println(c.x + "a");
                }

               }
        };
        JFrame frame=new JFrame();
        int x,y;
        ArrayList<Circle >circles = new ArrayList<Circle>();
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new Main();
                }
            });
        }
    public Main(){

        frame.setSize(512,512);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.addMouseListener(this);
        frame.add(thePanel);
        frame.setVisible(true);

    }   

    @Override
    public void mouseClicked(MouseEvent e) {
            System.out.println(e.getX());
            Circle c = new Circle();
            c.x=e.getX();
            c.y=e.getY();
            c.diameter=10;
            circles.add(c);
            repaint();
    }

圈子類

class Circle
    {
      public int x, y, diameter;
    }

我沒有使用getter和setter但我認為這不是問題所在。

如果將repaint()更改為thePanel.repaint() ,則應該能夠看到正在添加的圓圈。

它們看起來有點偏離位置,因為你從幀的鼠標監聽器獲取幀坐標,但是試圖在面板坐標中繪制。

編輯:
正如camickr在他的評論中指出的那樣,你實際上有兩個JFrame :一個是由new JFrame()實例化的,另一個是由new Main()實例化的。 這就是你的repaint沒有達到預期效果的原因:你所說的那個repaint不是你正在看的那個。 camickr建議您不要從JFrame繼承Main ,這是一個很好的建議。

用鼠標繪制橢圓形和拖動的寬度和高度

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.Point;

public class DrawOval extends Applet implementsMouseListener,MouseMotionListener {

    private int xstart,xend,ystart,yend;
    private boolean flag=false;
    private int width,heigth;
    private Point clickPoint;
    private Point dragPoint;
    private int x,y;

    public void init() {
        this.addMouseListener(this);
        this.addMouseMotionListener(this);
    }

    public void paint(Graphics p) {
        if (flag) {
            p.drawOval(x, y, width, heigth);
        }
    }

    @Override
    public void mouseClicked(MouseEvent me) {

    }

    @Override
    public void mousePressed(MouseEvent me) {
        clickPoint = me.getPoint();
    }

    @Override
    public void mouseReleased(MouseEvent me) {
    }

    @Override
    public void mouseEntered(MouseEvent me) {
    }

    @Override
    public void mouseExited(MouseEvent me) {
    }

    @Override
    public void mouseDragged(MouseEvent me) {
        dragPoint = me.getPoint();
        x = Math.min(clickPoint.x, dragPoint.x);
        y = Math.min(clickPoint.y, dragPoint.y);
        width = Math.max(clickPoint.x, dragPoint.x) - x;
        heigth = Math.max(clickPoint.y, dragPoint.y) - y;

        flag = true;
        repaint();
    }

    @Override
    public void mouseMoved(MouseEvent me) {

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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