Java 为什么我的矩形在我的JPanel中以一种奇怪的形式出现?
当我运行代码时,只有在Java 为什么我的矩形在我的JPanel中以一种奇怪的形式出现?,java,jpanel,Java,Jpanel,当我运行代码时,只有在JPanel的左上角单击鼠标时,才会显示一个矩形。当它出现时,它会扭曲变形。如果我将fillRect更改为fillOval,它根本不会显示。我的目标是在单击鼠标时在其位置填充一个圆圈。我的代码是: import java.awt.event.*; import java.awt.*; import javax.swing.*; public class PaintProgram { JFrame frame; JPanel panel; Point
JPanel
的左上角单击鼠标时,才会显示一个矩形。当它出现时,它会扭曲变形。如果我将fillRect
更改为fillOval
,它根本不会显示。我的目标是在单击鼠标时在其位置填充一个圆圈。我的代码是:
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class PaintProgram {
JFrame frame;
JPanel panel;
Point p;
int x;
int y;
int diameter;
public PaintProgram(){
frame = new JFrame();
frame.setSize(500,500);
panel = new JPanel();
diameter = 100;
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.addMouseListener(new MListener());
panel.add(new DrawCircle());
frame.add(panel);
frame.setVisible(true);
}
public static void main(String[] args){
PaintProgram p = new PaintProgram();
}
class UBListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent a){
}
}
class MListener implements MouseListener{
public void mousePressed(MouseEvent e){
p = panel.getMousePosition();
x = (int) p.getX();
y = (int) p.getY();
panel.add(new DrawCircle());
frame.repaint();
frame.revalidate();
System.out.println(x + "," + y);
}
public void mouseReleased(MouseEvent e){
}
public void mouseClicked(MouseEvent e){
}
public void mouseExited(MouseEvent e){
}
public void mouseEntered(MouseEvent e){
}
}
class DrawCircle extends JPanel{
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.orange);
g.fillRect(x,y,diameter,diameter);
System.out.println(x + "," + y);
}
}
}
我认为你的代码有几个问题。首先,在
PaintProgram
中定义的JPanel是不必要的,它导致了代码中的一些问题。基本上,我已经切换到使用JFrame来处理几乎所有的事情。接下来,我认为您不想在PaintProgram
中创建新的DrawCircle()
,只需单击鼠标即可
下面的代码对我很有用(每当你点击鼠标时,都会在光标周围画一个圆圈,我想这是你想要的)。我做了一些没有提到的改动,所以请随意提问
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class PaintProgram {
JFrame frame;
Point p;
int x;
int y;
int diameter;
public PaintProgram(){
frame = new JFrame();
frame.setSize(500,500);
diameter = 100;
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addMouseListener(new MListener());
frame.setVisible(true);
}
public static void main(String[] args){
PaintProgram p = new PaintProgram();
}
class UBListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent a){
}
}
class MListener extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e){
p = frame.getMousePosition();
x = (int) p.getX();
y = (int) p.getY();
frame.add(new DrawCircle());
frame.repaint();
frame.revalidate();
System.out.println(x + "," + y);
}
}
class DrawCircle extends JPanel{
@Override
public void paintComponent(Graphics g){
g.setColor(Color.orange);
g.fillOval(x - 56, y - 77, diameter, diameter);
System.out.println(x + "," + y);
}
}
}
检查这个答案:很好,尽管MListener可以扩展MouseAdapter,它对所有事件都有空的实现,因此代码变得更短。在方法可以添加到接口方法之前,还需要一个
@Override
,需要MouseAdapter.@JoopEggen我想我知道你的意思,听起来很流畅。请随时在您方便的地方编辑。