[英]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.