Java 摆动:鼠标光标悬停在矩形上时出现异常

Java Swing: Mouse cursor misbehaves when held over a rectangle

我需要在光标通过 contain(p) 在矩形数组列表上移动时更改光标 method.The 问题是

  1. 我的第一个使用迭代器遍历矩形的算法不起作用,因为 expected.The 光标仅在悬停在第一个矩形上时发生变化,在其他矩形中它也不会通过显示光标变化来响应也不通过控制台指示光标悬停在它们上方?!!
  2. 我的第二个解决方案也无法工作 properly.I 使用 for 循环遍历矩形,尽管矩形通过控制台指示鼠标悬停在它们上方,但光标拒绝更改,例外情况最后一个矩形的。
  3. 我在这个 SSCCE 中使用了 JPanel,只是因为它重现了我在使用 JTextPane 时遇到的问题...假设我的编码方法是有问题的。

我想我可能需要一个线程来提高响应和性能,但不确定 approach.Thanks 提前的人。

public class UnstableCursor extends JPanel{

    Rectangle2D rec;
    ArrayList<Rectangle2D> recList = new ArrayList<>();

    public UnstableCursor(){

    }

    public static void main(String[] args) {
        UnstableCursor uc = new UnstableCursor();
        JFrame frame = new JFrame();

        Mover mv = new Mover(uc);
        uc.addMouseListener(mv);
        uc.addMouseMotionListener(mv);
        JScrollPane jx = new JScrollPane(uc);

        frame.getContentPane().add(jx);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500,500);
        frame.setVisible(true);
    }


    @Override
    public void paintComponent(Graphics g) {

        super.paintComponents(g); 

        Graphics2D g2d = (Graphics2D)g;
        int x = 5;
        for(int i = 0;i < 4;i++){
            g2d.setColor(Color.red);
            rec = new Rectangle2D.Double(20,x,100,5);
            g2d.draw(rec);

            recList.add(rec);

            x += 50;
        }
        System.out.println("RecList is: " +recList.size());
    }  

}

class Mover extends MouseInputAdapter{
    UnstableCursor uc;
    Rectangle2D rec;
    ArrayList<Rectangle2D> reList;

    public Mover(UnstableCursor ucc){
        uc = ucc;
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        super.mouseDragged(e); 
        Point p = e.getPoint();
        System.out.println("xxxx");
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        Point p = e.getPoint();
        reList = uc.recList;
        //System.out.println("List is: "+reList.size());
        Iterator <Rectangle2D> recs = reList.iterator();

        //--------------------- First Algorithm ----------------------//
        if(recs.hasNext()){
            rec = recs.next();
            if(rec.contains(p)){
                System.out.println("inside the rectangle....");
                uc.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
            }               
            else{
            uc.setCursor(Cursor.getDefaultCursor());
            }

        }


        //--------------------- Second Algorithm  ---------------------//
        int r = 0;
        for(int i = 0;i<(reList.size());i++){
            rec = reList.get(r);
            //System.out.println("Rect No: "+r+"X: "+rec.getX()+"Y: "+rec.getY());
            r++;
            if(rec.contains(p)){
                System.out.println("inside the rectangle....");                    
                uc.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
            }
            else{
            uc.setCursor(Cursor.getDefaultCursor());
            }
        }

    }

}

the cursor refuses to change with the exception of the last rectangle.

您的基本搜索算法有误。一旦找到包含该点的矩形,您应该设置光标并跳出循环,否则您检查的下一个矩形将不匹配,光标将再次重置。

还有...

for(int i = 0;i < 4;i++){
     g2d.setColor(Color.red);
     rec = new Rectangle2D.Double(20,x,100,5);
     g2d.draw(rec);

     recList.add(rec);

     x += 50;
}

... 一种绘画方法,仅作绘画之用。

您不应该创建矩形并将它们添加到数组中,因为当 Swing 确定面板需要重新绘制时会不断调用 paintComponent() 方法。

应该在 class 的构造函数中将矩形添加到列表中,这样每个矩形只添加一次。