1
にわたり開催されたときにマウスカーソルが誤動作method.The問題がJavaのスイング:私はそれが(p)が含まれていることにより、四角形の配列リストの上に移動しながらカーソルを変更する必要がある長方形
- 私の最初のアルゴリズムであり、イテレータを使用して四角形を反復処理すると、期待どおりに機能しません。最初の矩形上にカーソルを置くとカーソルが変化し、他の矩形ではカーソルが変化していることを示すことも、カーソルがカーソルをホバリングしていることそれらの上?!!
- 私の2番目の解決策は正しく動作することも拒否しています。私は四角形を反復するためにforループを使用しますが、四角形はマウスが上にマウスを置いていることをコンソールから示しています。 。
- この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());
}
}
}
}
@camikrあなたは私のstackoverflow最大のヒーローの一つです!!!!-)私はまだあなたの例の多くを使用して、初心者です。答えのおかげで。私は実際には、 'break'キーワード。私がさらに明確にする必要がある部分は、矩形を作成して塗装方法で配列に追加すべきではないということです。あなたのアドバイス私は四角形の作成とリストをコンストラクタに移動しますが、どのように描画されますか?私のグラフィックオブジェクトは、コンストラクタで作成される矩形の数をどのように認識しますか? – Afroid1000
@ Afroid1000、 'グラフィックオブジェクトはコンストラクタで作成される矩形の数をどのように認識しますか? ' - 私はその質問を理解していません。検索アルゴリズムでLIstを反復する方法を知っています。あなたはペイントコードで同じことをします。リスト内のすべてのアイテムを繰り返して、各矩形をペイントします。 – camickr
私は今あなたを持っています。私は、Listインスタンスをペイントメソッドに追い越し、コンテンツを描画するためにそれを繰り返します。 – Afroid1000