Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JOptionPane无限循环_Java_Swing_Mouselistener - Fatal编程技术网

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,并在那里显示(彩色?)状态消息,而不是使用对话框

啊,我明白了。我甚至没想过。谢谢!:)不用担心,希望它仍然不起作用,但我只是在循环时删除了
,一切正常。再次感谢:)