2017-09-03 5 views
1

にわたり開催されたときにマウスカーソルが誤動作method.The問題がJavaのスイング:私はそれが(p)が含まれていることにより、四角形の配列リストの上に移動しながらカーソルを変更する必要がある長方形

  1. 私の最初のアルゴリズムであり、イテレータを使用して四角形を反復処理すると、期待どおりに機能しません。最初の矩形上にカーソルを置くとカーソルが変化し、他の矩形ではカーソルが変化していることを示すことも、カーソルがカーソルをホバリングしていることそれらの上?!!
  2. 私の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()); 
      } 
     } 

    } 

} 

答えて

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()メソッドが継続的に呼び出されるため、四角形を作成して配列に追加しないでください。

各矩形が1回だけ追加されるように、矩形をクラスのコンストラクタのListに追加する必要があります。

+0

@camikrあなたは私のstackoverflow最大のヒーローの一つです!!!!-)私はまだあなたの例の多くを使用して、初心者です。答えのおかげで。私は実際には、 'break'キーワード。私がさらに明確にする必要がある部分は、矩形を作成して塗装方法で配列に追加すべきではないということです。あなたのアドバイス私は四角形の作成とリストをコンストラクタに移動しますが、どのように描画されますか?私のグラフィックオブジェクトは、コンストラクタで作成される矩形の数をどのように認識しますか? – Afroid1000

+0

@ Afroid1000、 'グラフィックオブジェクトはコンストラクタで作成される矩形の数をどのように認識しますか? ' - 私はその質問を理解していません。検索アルゴリズムでLIstを反復する方法を知っています。あなたはペイントコードで同じことをします。リスト内のすべてのアイテムを繰り返して、各矩形をペイントします。 – camickr

+0

私は今あなたを持っています。私は、Listインスタンスをペイントメソッドに追い越し、コンテンツを描画するためにそれを繰り返します。 – Afroid1000

関連する問題