2016-03-25 10 views
1

実行時にJlayeredPaneのいずれかのレイヤーに線を描画しようとしています。私が現在直面しているのは、マウスを離すと自動的に線が描かれることです。マウスをもう一度クリックするまで、描いた線をそこに置いておきたい。私はこのように階層化区画でJLayeredPaneのいずれかのレイヤーでグラフィック(Piantコンポーネント)を使用する方法

layeredPane.add(iDimension, new Integer(1),0); 

をiDimensionを追加した

私はこのよう

iDimension = new getDimension(); 
    iDimension.setBounds(1, 12, 441, 380); 
    //iDimension.setOpaque(true); 
    iDimension.setBackground(new Color(0,0,0,100)); 

、以下の記述されたクラスを呼び出しています。ここgetDimensionクラス

public class getDimension extends JPanel { 

    public getDimension() { 
     setDoubleBuffered(true); 
     this.setBorder(UIManager.getBorder("ComboBox.border")); 
     this.repaint(); 
    } 

    Point pointStart = null; 
    Point pointEnd = null; 

    { 

     addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       pointStart = e.getPoint(); 
      } 

      public void mouseReleased(MouseEvent e) { 
       pointStart = null; 
      } 
     }); 

     addMouseMotionListener(new MouseMotionAdapter() { 
      public void mouseMoved(MouseEvent e) { 
       pointEnd = e.getPoint(); 
      } 

      public void mouseDragged(MouseEvent e) { 
       pointEnd = e.getPoint(); 
       repaint(); 
      } 
     }); 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 
     if (pointStart != null) { 
      g.setColor(Color.GREEN); 
      g.drawLine(pointStart.x, pointStart.y, pointEnd.x, pointEnd.y); 
      // System.out.println("" + pointStart.x +"," + pointStart.y +"," + pointEnd.x +"," +pointEnd.y); 
     } 
    } 
} 

です私はJavaの初心者です。私の質問にあいまいさがある場合は、問題なく修正してください。

+1

よりよいヘルプについては、[、最小完全、かつ検証プログラム例](http://stackoverflow.com/help/mcve)を作成し、掲載を検討してください。私たちはあなたのプログラム全体を見たいとは思っていませんが、あなたのコードをコンパイルしてコンパイルし、あなたの問題とは関係ない余分なコードがなくてもあなたの問題を実証しています。バグを分離して公開しようとするだけで、問題を非常にうまく解決できます。 –

+1

サイドノート:JPanelのpaintメソッドではなくpaintComponentメソッドを描画し、オーバーライドと思われるメソッドの上にある '@ Override'アノテーションを使用してください。 –

+1

サイドノート2:[Java命名規則](http://ja.wikipedia.org/wiki/Naming_convention_(programming)#Java)を学び、使いたいと思うでしょう。変数名はすべて小文字で始まり、クラス名は大文字で始める必要があります。これを学んでこれに従うことで、コードをよりよく理解でき、他者のコードをよりよく理解できるようになります。 –

答えて

2

私が現在直面しているのは、マウスを離すと自動的に線が描かれることです。マウスをもう一度クリックするまで、描いた線をそこに置いておきたい。

コードは、あなたがすることを教え何をやっている:

addMouseListener(new MouseAdapter() { 
    public void mousePressed(MouseEvent e) { 
     pointStart = e.getPoint(); 
    } 
    public void mouseReleased(MouseEvent e) { 
     pointStart = null; 
    } 
}); 

と:pointStartがnullであれば、あなたがラインを描画しないことを

public void paint(Graphics g) { 
     super.paint(g); 
     if (pointStart != null) { // ********* 
      g.setColor(Color.GREEN); 
      g.drawLine(pointStart.x, pointStart.y, pointEnd.x, pointEnd.y); 
     }  
    }  

注 - mouseReleasedでnullに設定しました!解決策 - それをしないでください。

例えば、

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 

@SuppressWarnings("serial") 
public class GetDimension extends JPanel { 

    private static final int PREF_W = 600; 
    private static final int PREF_H = PREF_W; 
    private Point pointStart = null; 
    private Point pointEnd = null; 

    public GetDimension() { 
     this.setBorder(UIManager.getBorder("ComboBox.border")); 
     this.repaint(); 

     MouseAdapter myMouse = new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       pointStart = e.getPoint(); 
       repaint(); 
      } 

      public void mouseDragged(MouseEvent e) { 
       pointEnd = e.getPoint(); 
       repaint(); 
      } 
     }; 

     addMouseListener(myMouse); 
     addMouseMotionListener(myMouse); 

    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (pointStart != null && pointEnd != null) { 
      g.setColor(Color.GREEN); 
      g.drawLine(pointStart.x, pointStart.y, pointEnd.x, pointEnd.y); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     GetDimension mainPanel = new GetDimension(); 

     JFrame frame = new JFrame("GetDimension"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      createAndShowGui(); 
     }); 
    } 
} 
+0

私のコードで変更する必要がありますので、私の目的を果たします。 –

+0

@ Amit.D:私はあなたに言った、違反行を取り除く。 pointStartをnullに設定しないでください。 –

+0

しかし、それは私のマウスをリリースした場所に描画される次の行のための私の出発点を変更しました。 –

関連する問題