Java Can';不要在JPanel上画椭圆
当鼠标点击时,我正试图在JPanel上画椭圆。我的代码不调用paintComponent,因此在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)
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) {
}
}