2017-01-29 23 views
-2

com.github.sarxos.webcamを使用して私のソフトウェアにウェブカメラを追加しました。それはWebcamPanelという名前のJPanelを持ち、私は自分のカスタムサイズの写真が必要ですが、あらかじめ定義されたウェブカメラのサイズを持っています。私は640 x 480でウェブカメラから撮影した画像を切り取ることができました。画像のこの部分が保存されることを示すために、WebcamPanelの上に赤い四角形を付けたいと思います。透明なJPanelを不透明なJPanelに重ねる方法は?

public class CardPanel { 
    Dimension panelDim = new Dimension(640, 480); 

    public Cardpanel(){ 
     //....Button Defined earlier 

     btnTakePhoto.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       webcameFrame(); 
      } 
     }); 
    } 

    private void webcamFrame(){ 

     imageFrame = new JFrame("Photo Capture"); 
     // Did some calculations to put window at center 
     imageFrame.setBounds(screenSize.width/2 - frameWidth/2, screenSize.height/2 - frameHeight/2, frameWidth, 
      frameHeight); 
     imageFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     imageFrame.setContentPane(contentPane); 

     JPanel webcamWindow = new JPanel(); 

     RedHighlighter redHighlighter = new RedHighlighter(); 

     Webcam webcam = Webcam.getDefault(); 
     webcam.setViewSize(WebcamResolution.VGA.getSize()); 

     webcamPanel = new WebcamPanel(webcam); 
     webcamPanel.setFillArea(true); 
     webcamPanel.setMirrored(false); 
     webcamPanel.setPreferredSize(panelDim); 

     webcamWindow.add(webcamPanel); 
     webcamWindow.add(redHighlighter); 

     hBox.add(webcamWindow); 
    } 

    // Sub Class just for drawing the rectangle 
    public class RedHighlighter extends JPanel{ 

     public RedHighlighter() { 
      // If you delete the following line, nothing will appear 
      setPreferredSize(new Dimension(400, 400)); 
     } 

     @Override 
     public void paint(Graphics g) { 
      g.setColor(Color.RED); 
      g.drawRect(100, 100, 200, 200); 
     } 
    } 
} 

私はJLayeredPanesを使用しますがあなたが何でそれが全体の大きさをカバーしていないし、一度に一つの項目が表示されます。

paintメソッドをオーバーライドすると、四角形を描画するのに役立ちましたが、それは側面にあり、上にはありません。

enter image description here あなたは長方形が左に向けたWebcamPanelをプッシュしている見ることができるように。 webcamPanelをその位置に残しておき、中央の四角形をその上に置きます。この問題に対する効率的なアプローチを提案してください。ありがとう!

+1

これを行うための一つの方法のために(http://docs.oracle.com/javase/tutorial/uiswing/misc/jlayer.html)[Compoentsを飾る方法】上のSwingのチュートリアルからのセクションをチェックアウト。 – camickr

答えて

2

使用しているレイアウトマネージャが原因で、1つのJPanelがプッシュされています。 1つのJPanelを別のものにしたい場合は、下のレベルのビデオ画像(JLayeredPane.DEFAULTのレイヤー)とその上の描画JPanelを使用して、JLayeredPaneを使用することを検討してください。

その他のオプションと課題:

  • あなたが潜在的にだけでなくpaintComponentメソッドで画像を表示することによって画像がで表示されているのと同じのJPanelに描くことができ、コードの行の後に(描画画像が表示されます。
  • ルックあなたの画像の上に描画「装飾」を追加する方法としてJLayerの使用に。ない
  • をペイント
  • は常にそれらは、paintComponent、 を上書き
  • オーバーライド内で常にスーパーのペイントメソッドを呼び出します。
+0

'WebcamPanel'は** github **からのバイナリです。私はそれを編集することができません。私は 'JLayeredPane'を好みのサイズで試しましたが、' setOpaque(false) 'の後でさえ全体の領域をカバーするようにサイズが変更されました。私はウェブカメラを見ることができませんでした。 –

+0

@MirwiseKhan:あなたの現在の適切なコードがなければ、あなたがどんな問題を抱えているのかを推測するのは難しいです。あなたの質問を編集してください。 –

+0

@HovercraftFulllOfEelsコードアップデート –

0

これは機能しました。

public class MyWebcamPanel extends WebcamPanel { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 2808353446021354508L; 

    public MyWebcamPanel(Webcam webcam) { 
     super(webcam); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     int x = 180; 
     int y = 87; 
     super.paintComponent(g); 
     g.setColor(Color.RED); 
     g.drawRect(x, y, 640-2*x, 480-2*y); 

    } 

} 
関連する問題