如何将透明JPanel放在不透明的JPanel上?

时间:2017-01-29 17:02:02

标签: java swing graphics jpanel awt

我已使用com.github.sarxos.webcam向我的软件添加了网络摄像头。它有一个名为JPanel的{​​{1}},并且具有预定义的网络摄像头大小,而我需要自定义尺寸的图片。我设法在WebcamPanel裁剪从网络摄像头拍摄的图像。我想在640 x 480上放一个红色矩形,表示图片的这一部分将被保存。

WebcamPanel

我使用了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方法帮助我绘制矩形,但它在侧面而不在顶部。

enter image description here 如您所见,矩形向左推动paint。我希望WebcamPanel保持在它的位置,而它上面的矩形位于中心。请建议一个有效的方法来解决这个问题。谢谢!

2 个答案:

答案 0 :(得分:2)

由于您正在使用的布局管理器,正在推动一个JPanel。如果你想让一个JPanel过度使用另一个JPanel,你会考虑使用JLayeredPane,视频图像位于较低级别,可能是JLayeredPane.DEFAULT图层,也可以是上面的绘图JPanel。

其他选项和问题:

  • 您可以通过在paintComponent方法和图形中显示图像来绘制显示图像的相同JPanel(在显示图像后,以代码行显示。< / LI>
  • 使用JLayer作为添加绘图和装饰的方式&#34;在你的形象上。
  • 始终覆盖paintComponent,绘制
  • 始终在覆盖范围内调用超级绘画方法。

答案 1 :(得分: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);

    }

}