gpt4 book ai didi

Java Swing : Mouse cursor misbehaves when held over a rectangle

转载 作者:行者123 更新时间:2023-11-30 06:31:22 25 4
gpt4 key购买 nike

当光标通过 contains(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());
}
}

}

}

最佳答案

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() 方法。

应将矩形添加到类构造函数中的列表中,以便每个矩形仅添加一次。

关于Java Swing : Mouse cursor misbehaves when held over a rectangle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46027174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com