java - JOptionPane 无限循环

标签 java swing mouselistener

我有一个程序,它接受用户的鼠标单击并使用鼠标的坐标绘制一系列六边形。我在 JPanel 上画了一个红色矩形,它应该代表允许用户单击的边界,因此为了确保用户这样做,我添加了一条警告消息,每当用户点击超出范围。它说,“无法单击红色矩形之外。请重试。”

消息弹出后,我希望用户能够忽略该消息并重试,但是每当用户单击右上角的“确定”或“X”时,该消息就会再次出现,我好像无法关闭弹出框。有没有其他方法可以通知用户,同时让他们重试?

下面是我为 JPanelhexPanel 实现的 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) {}
    });

最佳答案

您的 while-loop 正在阻塞事件调度线程,这意味着不可能发生任何新的鼠标点击...

做一些更像......的事情可能会更好

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.");
}

关于java - JOptionPane 无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28468766/

相关文章:

java - Ant JUnit Batchtest .java 或 .class

java - 重定向到 "servlet?success"

java - JFileChooser 没有文件名文本字段选项

java - 更改 JComponent 的属性

java - 在没有 mousePressed 的情况下检测 mouseReleased

java - 为迷宫创建平铺 map n*n

java - ListView.getChildAt() 获取不在屏幕上的 child

java - 使用ArrayList获取二维数组数据

Java JTextfields

java - 在Java中,如何在不调用mousePressed和mouseReleased的情况下使用mouseClicked?