Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';不要在JPanel上画椭圆_Java_Swing - Fatal编程技术网

Java Can';不要在JPanel上画椭圆

Java Can';不要在JPanel上画椭圆,java,swing,Java,Swing,当鼠标点击时,我正试图在JPanel上画椭圆。我的代码不调用paintComponent,因此在JPanel上不会发生任何事情。我遗漏了哪一部分 public class Main extends JFrame implements MouseListener{ JPanel thePanel = new JPanel(){ @Override protected void paintComponent(Graphics g)

当鼠标点击时,我正试图在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();
    }

我没有使用getter和setter,但我认为这不是问题所在。

如果您将
repaint()
更改为
thePanel.repaint()
,您应该能够看到添加的圆圈

它们看起来有点偏离位置,因为您正在从帧的鼠标侦听器获取帧坐标,但尝试在面板坐标中绘制

编辑:

正如卡米克尔在他的评论中指出的,实际上有两个
JFrame
s:一个由
newjframe()
实例化,另一个由
newmain()
实例化。这就是您的
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) {

    }
}

您的面板没有重新喷漆。尝试
thePanel.repaint()
而不是
repaint()
。我认为这个问题与这里提出的相同问题是重复的:
public class Main扩展了JFrame..
1)
Main
是一个非常不规范的名称,因此没有帮助。让它有意义。类似于
OvalGUI
的内容更具描述性。2) 无需扩展JFrame,因为:A)GUI创建了一个。B)
JFrame
类的任何方法都没有被重写。@只有人知道这不是它的副本。另一个问题中的代码有一系列不同的问题,但问题与此不同。我对java GUI不感冒,它可以工作,谢谢khelwood。(1-
在框架上调用repaint()不一定会触发面板的绘制
-重新绘制()在框架上,将重新绘制框架的所有子组件。@camickr你说得很对。在回答之前,我应该仔细看看。@NerdicSapo,问题是该类扩展了JFrame并创建了另一个JFrame,而您正在重新绘制错误的帧。不要扩展JFrame,它是混乱的,没有必要的!但是请注意,只重新绘制面板而不是整个框架更有效。我建议您查看上的Swing教程中的部分,以获得一个工作示例,该示例将向您展示如何更好地构造代码以防止出现此问题
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) {

    }
}