Java 鼠标单击坐标仅第一次出现,其他坐标始终相同
我正在制作一个程序,在点击的地方画圆圈 第一次单击时,它绘制的圆圈与我单击的位置不完全相同 但是,对于其他点击,它只是一个接一个地画圆圈。我发现这是因为点击的坐标不会改变 我的主要意见是:Java 鼠标单击坐标仅第一次出现,其他坐标始终相同,java,swing,Java,Swing,我正在制作一个程序,在点击的地方画圆圈 第一次单击时,它绘制的圆圈与我单击的位置不完全相同 但是,对于其他点击,它只是一个接一个地画圆圈。我发现这是因为点击的坐标不会改变 我的主要意见是: public static void main(String[] args) { JFrame frame = new JFrame(); //set window size frame.setSize(1000, 1000); //set the title frame.set
public static void main(String[] args)
{
JFrame frame = new JFrame();
//set window size
frame.setSize(1000, 1000);
//set the title
frame.setTitle("Oval Draw");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//add panel to frame and make it visible
MouseComponent component = new MouseComponent();
frame.add(component);
frame.setVisible(true);
}
以及MouseComponent类:
public class MouseComponent extends JPanel implements MouseListener
{
boolean drawPoint = true;
boolean drawLine = false;
boolean drawOval = false;
public MouseComponent()
{
super();
pointX = 0;
pointY = 0;
lineX = 0;
lineY = 0;
addMouseListener(this);
}
int pointX, pointY, lineX, lineY;
int[] ArrayX,ArrayY;
@Override
public void paintComponent(Graphics g)
{
for(int i=0; i<10; i++)
{
super.paintComponent(g);
if(drawLine)
{
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
Color startrandomColor = new Color(red, green, blue);
red = (int) (Math.random() * 255);
green = (int) (Math.random() * 255);
blue = (int) (Math.random() * 255);
Color endrandomColor = new Color(red, green, blue);
Graphics2D g2d = (Graphics2D) g;
// this.addMouseListener(this);
GradientPaint gradient = new GradientPaint(70, 70, startrandomColor,
150, 150, endrandomColor);
g2d.setPaint(gradient);
g2d.translate( lineX, lineY);
g2d.fillOval(70, 70, 100, 100);
System.out.print(lineX);
System.out.print(" ");
System.out.print(lineY);
System.out.print(" ");
System.out.print(pointX);
System.out.print(" ");
System.out.print(pointY);
System.out.print(" ");
// repaint();
}
else if(drawPoint)
{
// g.drawOval(pointX-5,pointY-5,10,10);
}
}
}
public void mouseClicked(MouseEvent mouse)
{
if(!drawPoint)
{
pointX = mouse.getX();
pointY = mouse.getY();
drawPoint = true;
}
else if(!drawLine)
{
lineX = mouse.getX();
lineY = mouse.getY();
drawLine = true;
}
repaint();
}
public void mouseEntered(MouseEvent mouse){ }
public void mouseExited(MouseEvent mouse){ }
public void mousePressed(MouseEvent mouse){ }
public void mouseReleased(MouseEvent mouse){ }
}
公共类MouseComponent扩展JPanel实现MouseListener
{
布尔值drawPoint=true;
布尔绘制线=假;
布尔值=假;
公共鼠标组件()
{
超级();
点x=0;
pointY=0;
lineX=0;
lineY=0;
addMouseListener(这个);
}
int pointX,pointY,lineX,lineY;
int[]ArrayX,ArrayY;
@凌驾
公共组件(图形g)
{
对于(int i=0;i这里:
if(!drawPoint)
{
pointX = mouse.getX();
pointY = mouse.getY();
drawPoint = true;
}
没有太多意义。您将drawPoint初始化为true
…这样您就不会输入if块并收集单击坐标
除此之外,当你研究你的另一种方法时,画点的代码被注释掉了
建议:退后一步;不要试图同时做5件事。编写完成这5件事所需的代码
- 单击后获取鼠标坐标
- 围绕那个坐标画圆圈
然后让它开始工作。暂时忘记画线,形状,任何东西
当你有一个只做点击+画圈的类,然后创建一个新的类,在那里你可以添加更多的功能。你现在“真正”的问题是你开始研究各种功能;你试图“集成”把它们放在一个单独的课堂上会让你感到困惑,这并不奇怪……不起作用
长话短说:忘记了你的代码中现在有一个奇怪的逻辑,在绘图点和线之间“切换”。绘制点。然后,当这起作用时……添加一些单选按钮;或一个下拉菜单,并使用来控制你是否要绘制线或点。不要让它“隐式”通过在事件处理程序代码中切换布尔值!这里:
if(!drawPoint)
{
pointX = mouse.getX();
pointY = mouse.getY();
drawPoint = true;
}
没有太多意义。您将drawPoint初始化为true
…这样您就不会输入if块并收集单击坐标
除此之外,当你研究你的另一种方法时,画点的代码被注释掉了
建议:退后一步;不要试图同时做5件事。编写完成这5件事所需的代码
- 单击后获取鼠标坐标
- 围绕那个坐标画圆圈
然后让它开始工作。暂时忘记画线,形状,任何东西
当你有一个只做点击+画圈的类,然后创建一个新的类,在那里你可以添加更多的功能。你现在“真正”的问题是你开始研究各种功能;你试图“集成”把它们放在一个单独的课堂上会让你感到困惑,这并不奇怪……不起作用
长话短说:忘记了你的代码中现在有一个奇怪的逻辑,在绘图点和线之间“切换”。绘制点。然后,当这起作用时……添加一些单选按钮;或一个下拉菜单,并使用来控制你是否要绘制线或点。不要让它“隐式”通过在事件处理程序代码中切换布尔值!boolean drawPoint=true;
boolean drawLine=false;
使其第一次打印。之后两者都设置为true,因此不会更改坐标。boolean drawPoint=true;
boolean drawLine=false;
使其第一次打印。之后这两个参数都设置为true,因此它不会改变坐标。因此,第一次查看时,您将声明布尔值drawPoint
和drawLine
。在鼠标事件上,您对这些布尔值进行了否定测试。在第一次单击时,他将进入绘制线因为false变为true,drawPoint也会变为true。之后在MouseeEvent中,两者的计算结果都将变为true,并将变为false。您不会得到新的X和Y。除此之外,您希望其他人花时间帮助您。因此,请您花时间对所有源代码进行良好的格式化/缩进。为了更快地获得更好的帮助,请发布或。因此,第一次查看时,您声明布尔值drawPoint
和drawLine
。在MouseeEvent上,您对这些布尔值进行了阴性测试。在第一次单击时,他将进入drawLine,因为false变为true,drawPoint变为false。之后,这两个布尔值将在MouseeEvent中计算为true,并在MouseeEvent中变为false。您不要像看上去那样得到新的X和Y。除此之外:你希望其他人花时间来帮助你。因此,请你花时间好好格式化/缩进你的所有源代码。为了更快地获得更好的帮助,请发布一个or。因为你的答案非常有建设性和详细。你介意包括我的评论吗?(如果是真的)在我看来,这也是一个逻辑错误,因为如果你查看变量drawPoint
和drawLine
以及它们在mouseClicked中的检查方式,mouseClicked
在第一次单击后将永远不会做任何事情。@Nico:我重新编写了一点,并添加了。谢谢你的输入;-)由于你的回答非常有建设性和详细,你介意包括我的评论吗?(如果是真的)在我看来,这也像是一个逻辑错误,因为如果你查看变量drawPoint
和drawLine
以及它们在mouseClicked中的检查方式,mouseClicked
在第一次单击后将永远不会做任何事情。@Nico:我重新编写了一点,并添加了。谢谢你的帮助