3

JPanelマウスをドラッグしたときに2本(またはそれ以上)の線を描きたい。コードで使用するsuper.paintComponent(g) と、パネルに2本の線を描くことができませんでしたが、使用しないsuper.paintComponent(g);と、下の写真のように見苦しい結果になります。

ここに画像の説明を入力してください

なぜ線がそのように振る舞ったのか理解しています。

マウスをドラッグするときにパネルに線を引くにはどうすればよいですか?

ところで、g2d.draw(line2d)時々それによって描かれた線は滑らかな線ではありません(下の写真)

ここに画像の説明を入力してください

これまでの私のコード:

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;


public class LineDrawing extends JPanel implements MouseMotionListener, MouseListener{
    Point point1;
    Point point2;
    Line2D line2d;

  public LineDrawing(){
       super();
       addMouseListener(this);
       addMouseMotionListener(this);
    }

 @Override
  public void paintComponent(Graphics g){

    //super.paintComponent(g);

       Graphics2D g2d = (Graphics2D) g;
       if(point1!=null && point2!=null){

          g2d.setPaint(Color.RED);
          g2d.setStroke(new BasicStroke(1.5f));
          g2d.draw(line2d);

         }
      }   


  @Override
  public void mouseDragged(MouseEvent e) {

    point2 = e.getPoint();
    line2d = new Line2D.Double(point1, point2); 
    repaint();

  }

   @Override
   public void mouseMoved(MouseEvent e) {

   }

   @Override
   public void mouseClicked(MouseEvent e) {

  }

   @Override
   public void mousePressed(MouseEvent e) {
     point1 = e.getPoint();

   }

  @Override
  public void mouseReleased(MouseEvent e) {

  }

 @Override
 public void mouseEntered(MouseEvent e) {

 }

 @Override
 public void mouseExited(MouseEvent e) {

}


public static void main(String a[]){
   EventQueue.invokeLater(new Runnable(){
        @Override
        public void run() {

         JFrame frame = new JFrame();
         LineDrawing linedraw= new LineDrawing();
         frame.add(linedraw);
         frame.setSize(500,500);
         frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
         frame.setVisible(true);   

                         }
                });
   }   
}
4

2 に答える 2

5

..2本の線を引く

それがこの質問の核心のようです。

クリック/ドラッグするときに行のコレクションを展開可能なリスト(例ArrayList)に保持し、リストに新しい行を追加して、を呼び出しますrepaint()。でpaintComponent(Graphics)、コレクションを繰り返し、各線を描画します。

ところで-これをテストしている間、ウィンドウを最小化して復元していないと思います。あなたの線(美しいか醜い)は消えるでしょう!


..彼らは姿を消した。どういう理由ですか?

メソッドpaint()paintComponent()は、GUIを再描画する必要があるときに呼び出されます。アプリの前面に別のウィンドウが表示された後に呼び出され、前面に戻される場合があります。別の時間は、最小化から復元された後です。

行を保持するためのオプションは次のとおりです。

  • 線の位置を保存し、要求されたときはいつでも(上記のように)すべてを再描画します。これはほとんどの目的で機能します。数百行ある場合でも、GUIは「瞬く間に」それらを再描画します。
  • 各線をaに描画しBufferedImage、画像を(ImageIconin)aに配置しJLabelます。このアプローチは、描画領域が固定サイズであり、何も削除されておらず、何百万もの線、円弧、半透明領域、小さい画像、テキストに対応できる場合にうまく機能します。画像をレンダリングサーフェスとして使用すると、ArrayList画像に新しい行を追加し、ラベルを再描画して新しい行と以前のすべての行を表示するだけなので、は不要になります。

..線は直線ではありません。

これは、線を描くときに使用される「レンダリングのヒント」が原因です。ピクセルの整列された行で構成される画面は、垂直線または水平線のみを完全に作成できます。他の角度で直線と連続線の「錯覚」を与えるには、ディザリングと呼ばれる手法が必要です。Graphics2Dの詳細な説明と説明については、の冒頭のセクションをお読みくださいRenderingHints

于 2012-04-18T13:37:50.807 に答える
1

質問があるかどうかはわかりませんが、実線を描きたい場合は。ドラッグするときは、最後のポイント位置を更新する必要があります。

@Override
  public void mouseDragged(MouseEvent e) {
    point2 = e.getPoint();
    line2d = new Line2D.Double(point1, point2); 
    point1 = point2;  // add this line
    repaint();
  }
于 2012-04-18T13:38:38.713 に答える