2016-04-04 18 views
1

私はまだJavaの基礎を学んでいます。私がしようとしたのは、ポイントと行をArrayListsに格納してから、paintComponent()メソッドにそれらを通し、呼び出されるたびにそれらを描画させることです。私は自分のポイントに同じArrayListを使用しているので、マウスを押すたびにクリアして、新しいラインは前のラインとつながりません。スイング:マウスドラッグで描く線は、マウスをドラッグしたときに表示されます。

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.BorderFactory; 
import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseAdapter; 
import java.util.ArrayList; 


public class SwingPaintDemo2 { 

    public static void main(String[] args) { 
     JFrame f = new JFrame("Swing Paint Demo"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(300,300); 
     f.add(new MyPanel()); 
     f.setBackground(Color.WHITE); 
     f.setVisible(true); 
    } 
} 

class MyPanel extends JPanel { 

    private int x; 
    private int y; 
    private int x2; 
    private int y2; 

    private ArrayList<Point> points = new ArrayList<Point>(); 
    private ArrayList<Curves> curvedLines = new ArrayList<Curves>(); 

    public MyPanel() { 

     setBorder(BorderFactory.createLineBorder(Color.black)); 

     addMouseMotionListener(new MouseAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       points.add(new Point(e.getX(), e.getY())); 
       repaint(); 
      } 
     }); 

     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       points.clear(); 
       points.add(new Point(e.getX(), e.getY())); 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       ArrayList<Point> newPoints = new ArrayList<Point>(); 
       for (int i = 0; i < points.size(); i++) { 
        newPoints.add(points.get(i)); 
       } 
       curvedLines.add(new Curves(newPoints)); 
      } 
     }); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.BLACK); 


      for (int c = 0; c < points.size() - 1; c++) { 
       x = (int) points.get(c).getX(); 
       y = (int) points.get(c).getY(); 
       x2 = (int) points.get(c + 1).getX(); 
       y2 = (int) points.get(c + 1).getY(); 
       g.drawLine(x, y, x2, y2); 
      } 


      for (int t = 0; t < curvedLines.size(); t++) { 
       ArrayList<Point> iterator = curvedLines.get(t).points; 
       for (int c = 0; c < iterator.size() - 1; c++) { 
        x = (int) iterator.get(c).getX(); 
        y = (int) iterator.get(c).getY(); 
        x2 = (int) iterator.get(c + 1).getX(); 
        y2 = (int) iterator.get(c + 1).getY(); 
        g.drawLine(x, y, x2, y2); 
       } 
      } 

    } 


     class Curves { 
      private ArrayList<Point> points; 

      public Curves(ArrayList<Point> points) { 
       this.points = new ArrayList<Point>(); 
       this.points = points; 
      } 
     } 
    } 

問題は、私は、マウスをドラッグしながら、何のラインが描かれていないが、私は再び、マウスをドラッグすると行が表示されますので、その点はまだ保存されていることです。この明らかな遅延の原因は何ですか?

+1

のためだけで正常に動作しますが、同様の質問をするときには、昨日の答えを与えられました。あなたのコードはあなたが与えたコードとどう違うのですか?要点は、コードを作業コードと比較して違いを見つけることです。独自のコードをデバッグする方法を学ぶ必要があります。私はペイントコードのif/else文は必要ないと答えていると思います。 – camickr

+0

この質問を以前のものに追加する方法がわかりませんでした。そのため、私はそれを自分自身の質問として掲示すると考えました。 'paintComponenet'は私の' curvedLines'ArrayListに要素がなくなるまで何も描画しないので、最初の行が描画されないようにif/else文を追加しました。前にコードサンプルを調べましたが、コードがうまくいかない理由をすぐには理解できませんでした。たぶん、私はちょうどスイングコンポーネントの背後にあるロジック/構造を非常によく理解していません。 – Mystic

+0

この質問を以前の質問に追加するように求められていませんでした。スレッドごとに1つの質問しか持たないようにしてください。あなたの質問には回答があったので、チェックマークをクリックして回答を「受け入れる」べきで、人々は問題が解決されたことを知りました。 – camickr

答えて

1

私の元のコメントでは、最後の質問に記載されている作業コードと、ここに投稿したコードを比較して、その違いを確認するように求められました。

違いは、paintComponent()メソッドでif/elseステートメントを追加したことです。

paintComponenetはどんな意味がありません。何も

を描画しませんので、私は、if/else文を追加しました。 if/elseステートメントを追加すると、1つのタイプのペイントしか実行できないことを意味します。カーブをペイントするかポイントをペイントすることはできますが、両方を行うことはできません。

あなたはいつもの両方をしたい:彼らはmouseDragged()イベント

  • に追加されるよう

    1. は、あなたの曲線に追加されたすべての古いポイントを描くポイントをペイント。

    if/else文を削除します。

    また、今後コードを投稿するときに適切なSSCCEを投稿するとコードを実行できます。ここに掲載されたコードにはmain()メソッドやJFrameがありませんので、コンパイルやテストはできません。 camickrの勧告に基づいて

  • +0

    if/else文を追加する前に問題が発生しました。最初に私は上記の 'for'ループだけを持っていました。ここで' curvedLines'リストを繰り返し、各要素(行)を取り出し、その要素を構成するすべての点の間に線を描きます。しかし私は、私の 'curvedLines'リストが空になることに気づいたので、マウスをドラッグしたときに' for'ループが実行されませんでした。ですから 'if/else'文を置いて、 'curvedLines'の前に' for'ループを実行してから、その後に 'for'ループを実行させます。 – Mystic

    +0

    @ミスティック、あなたはあなたを助けることを非常に困難にしています。あなたが以前に持っていた問題は無関係です。関連するのは、私たちが見るためにフォーラムに投稿するコードだけです。それが私たちの提案に基づいています。問題がif/else文であることを何回示唆しましたか?今投稿したコードからif/else文を削除しましたか?私はあなたの質問に答える時間がかかる場合は、私の提案を試して時間を取ることができるとは思わないか??? – camickr

    +0

    お詫び申し上げますが、ここに私のコードを再掲載してほしいと気づいていませんでした。私はそれを取り除き、それを私自身で試しましたが、何も変わりませんでした。私はここに投稿します。 – Mystic

    0

    、それは私

    import java.awt.Color; 
    import java.awt.EventQueue; 
    import java.awt.Graphics; 
    import java.awt.Point; 
    import java.awt.event.MouseAdapter; 
    import java.awt.event.MouseEvent; 
    import java.util.ArrayList; 
    import javax.swing.BorderFactory; 
    import javax.swing.JFrame; 
    import javax.swing.JPanel; 
    import javax.swing.UIManager; 
    import javax.swing.UnsupportedLookAndFeelException; 
    
    public class SwingPaintDemo2 { 
    
        public static void main(String[] args) { 
         new SwingPaintDemo2(); 
        } 
    
        public SwingPaintDemo2() { 
         EventQueue.invokeLater(new Runnable() { 
          @Override 
          public void run() { 
           try { 
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
           } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
            ex.printStackTrace(); 
           } 
    
           JFrame frame = new JFrame("Testing"); 
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
           frame.add(new MyPanel()); 
           frame.pack(); 
           frame.setLocationRelativeTo(null); 
           frame.setVisible(true); 
          } 
         }); 
        } 
    
        class MyPanel extends JPanel { 
    
         private int x; 
         private int y; 
         private int x2; 
         private int y2; 
    
         private ArrayList<Point> points = new ArrayList<Point>(); 
         private ArrayList<Curves> curvedLines = new ArrayList<Curves>(); 
    
         public MyPanel() { 
    
          setBorder(BorderFactory.createLineBorder(Color.black)); 
    
          addMouseMotionListener(new MouseAdapter() { 
           @Override 
           public void mouseDragged(MouseEvent e) { 
            points.add(new Point(e.getX(), e.getY())); 
            repaint(); 
           } 
          }); 
    
          addMouseListener(new MouseAdapter() { 
           @Override 
           public void mousePressed(MouseEvent e) { 
            points.clear(); 
            points.add(new Point(e.getX(), e.getY())); 
           } 
    
           @Override 
           public void mouseReleased(MouseEvent e) { 
            ArrayList<Point> newPoints = new ArrayList<Point>(); 
            for (int i = 0; i < points.size(); i++) { 
             newPoints.add(points.get(i)); 
            } 
            curvedLines.add(new Curves(newPoints)); 
            repaint(); 
           } 
          }); 
         } 
    
         @Override 
         protected void paintComponent(Graphics g) { 
          super.paintComponent(g); 
          g.setColor(Color.BLACK); 
    
          for (int c = 0; c < points.size() - 1; c++) { 
           x = (int) points.get(c).getX(); 
           y = (int) points.get(c).getY(); 
           x2 = (int) points.get(c + 1).getX(); 
           y2 = (int) points.get(c + 1).getY(); 
           g.drawLine(x, y, x2, y2); 
          } 
          for (int t = 0; t < curvedLines.size(); t++) { 
           ArrayList<Point> iterator = curvedLines.get(t).points; 
           for (int c = 0; c < iterator.size() - 1; c++) { 
            x = (int) iterator.get(c).getX(); 
            y = (int) iterator.get(c).getY(); 
            x2 = (int) iterator.get(c + 1).getX(); 
            y2 = (int) iterator.get(c + 1).getY(); 
            g.drawLine(x, y, x2, y2); 
           } 
          } 
         } 
    
         class Curves { 
    
          private ArrayList<Point> points; 
    
          public Curves(ArrayList<Point> points) { 
           this.points = new ArrayList<Point>(); 
           this.points = points; 
          } 
         } 
        } 
    } 
    
    +0

    ええ、私の問題は、両方のforループブロックが必要であることを理解できなかったことです。私は2番目のブロックしか保管していませんでした。 – Mystic

    +0

    私は 'EventQueue'、' UIManager'、 'run'などの追加について素早く質問しています。私はそれに慣れていません。彼らはどのような目的を果たしていますか?コードのその部分は、私が調べることができるOracleのdocの特定のカテゴリの下にありますか? – Mystic

    +0

    UIManagerは、Metalを嫌うので、Look&Feelを「システム」のルックアンドフィールに設定します。 EventQueue.invokeLaterは、私のuiコードがEDTのコンテキスト内で開始されることを保証します。これは完了したシステムのいくつかの問題を克服します。 – MadProgrammer

    関連する問題