Java JOptionPane无限循环
我有一个程序,可以接受用户的鼠标点击,并使用鼠标坐标绘制一系列六边形。我在我的Java JOptionPane无限循环,java,swing,mouselistener,Java,Swing,Mouselistener,我有一个程序,可以接受用户的鼠标点击,并使用鼠标坐标绘制一系列六边形。我在我的JPanel上画了一个红色矩形,它应该代表允许用户点击的边界,因此为了确保用户可以点击,我添加了一条警告消息,每当用户点击超出边界时就会弹出。它说,“无法在红色矩形外单击。请重试。” 消息弹出后,我希望用户能够关闭消息并重试,但每当用户单击右上角的“OK”或“X”时,消息会再次出现,我似乎无法关闭弹出框。有没有其他方法可以在让用户重试时通知用户 下面是我为我的JPanel,hexPanel实现的MouseListene
JPanel
上画了一个红色矩形,它应该代表允许用户点击的边界,因此为了确保用户可以点击,我添加了一条警告消息,每当用户点击超出边界时就会弹出。它说,“无法在红色矩形外单击。请重试。”
消息弹出后,我希望用户能够关闭消息并重试,但每当用户单击右上角的“OK”或“X”时,消息会再次出现,我似乎无法关闭弹出框。有没有其他方法可以在让用户重试时通知用户
下面是我为我的JPanel
,hexPanel
实现的MouseListener
的代码
hexPanel.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
boolean clicked = false;
int left = HexDrawingPanel.iX(-rWidth/2), right = HexDrawingPanel.iX(rWidth/2);
int top = HexDrawingPanel.iY(rHeight/2), bot = HexDrawingPanel.iY(-rHeight/2);
while(!clicked) {
if(!(e.getX() > right || e.getX() < left ||
e.getY() < top || e.getY() > bot))
clicked = true;
else
JOptionPane.showMessageDialog(frame, "Must click inside red rectangle. Try again.");
}
HexDrawingPanel.radius = (float)Math.sqrt(Math.pow(e.getX() - left, 2) + Math.pow(e.getY() - top, 2));
hexPanel.repaint();
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
});
hexPanel.addMouseListener(新的MouseListener(){
公共无效mouseClicked(MouseEvent e){
布尔值=假;
int left=hextrawingpanel.iX(-rWidth/2),right=hextrawingpanel.iX(rWidth/2);
int top=hextrawingpanel.iY(rHeight/2),bot=hextrawingpanel.iY(-rHeight/2);
当(!单击)时{
如果(!(e.getX()>右| | e.getX()<左| |
e、 getY()bot))
单击=真;
其他的
showMessageDialog(框,“必须在红色矩形内单击。重试”);
}
hextrawingpanel.radius=(float)Math.sqrt(Math.pow(e.getX()-left,2)+Math.pow(e.getY()-top,2));
hexPanel.repaint();
}
公共无效mouseenterned(MouseEvent e){}
公共无效mouseExited(MouseEvent e){}
public void mousePressed(MouseEvent e){}
公共无效MouseEvent e{}
});
您的while循环
正在阻止事件调度线程,这意味着任何新的鼠标点击都不可能发生
也许做一些更像
if(!(e.getX() > right || e.getX() < left ||
e.getY() < top || e.getY() > bot)) {
HexDrawingPanel.radius = (float)Math.sqrt(Math.pow(e.getX() - left, 2) + Math.pow(e.getY() - top, 2));
hexPanel.repaint();
} else
JOptionPane.showMessageDialog(frame, "Must click inside red rectangle. Try again.");
}
if(!(e.getX()>right | | e.getX()bot)){
hextrawingpanel.radius=(float)Math.sqrt(Math.pow(e.getX()-left,2)+Math.pow(e.getY()-top,2));
hexPanel.repaint();
}否则
showMessageDialog(框,“必须在红色矩形内单击。重试”);
}
有几种方法可以做到这一点:
- 您可以使侦听器有状态,在显示选项窗格之前设置一个全局标志,并忽略鼠标单击,直到取消设置标志为止
- 您可以在框上方放置一个JLabel,并在那里显示(彩色?)状态消息,而不是使用对话框
,一切正常。再次感谢:)