【问题标题】:Java Swing: Mouse cursor misbehaves when held over a rectangleJava Swing:鼠标光标在矩形上方时行为异常
【发布时间】:2017-09-03 19:34:55
【问题描述】:

我需要通过contain(p)方法在一个矩形数组列表上移动光标时更改光标。问题是

  1. 我第一个使用迭代器遍历矩形的算法没有按预期工作。光标仅在悬停在第一个矩形上时发生变化,在其他矩形中它既不会通过显示光标变化来响应,也不会通过控制台光标悬停在它们上方?!!
  2. 我的第二个解决方案也拒绝正常工作。我使用 for 循环遍历矩形,虽然矩形通过控制台指示鼠标悬停在它们上方,但光标拒绝更改,除了最后一个矩形.
  3. 我在此 SSCCE 中使用 JPanel,只是因为它重现了使用 JTextPane 时遇到的问题...假设我的编码方法是有问题的。

我在想我可能需要一个线程来提高响应和性能,但不确定该方法。在此先感谢大家。

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());
            }
        }

    }

}

【问题讨论】:

    标签: java swing jpanel java-2d jtextpane


    【解决方案1】:

    光标拒绝改变,除了最后一个矩形。

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

    还有……

    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() 方法会不断调用。

    矩形应该在类的构造函数中添加到 List 中,这样每个矩形只添加一次。

    【讨论】:

    • @camikr 你是我的 stackoverflow 最大的英雄之一!!!:-) 我还是个新手,使用了很多你的例子。谢谢你的回答。我真的理解突破使用“break”关键字循环回答。我需要进一步澄清的部分是我不应该创建矩形并将它们添加到绘画方法中的数组中。所以你建议我将矩形创建和列表移动到构造函数,但是它们将如何绘制?我的图形对象如何知道构造函数中创建的矩形数量?
    • @Afroid1000, How will my graphic object be aware of the number of rectangle being created in the constructor? - 我不明白这个问题。您知道如何在搜索算法中遍历 LIst。那么你在绘画代码中做同样的事情。您遍历列表中的所有项目,然后绘制每个矩形。
    • 我已经找到你了。我需要将 List 实例传递给 paint 方法并对其进行迭代以绘制其内容。非常感谢
    猜你喜欢
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多