Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按钮似乎被视频覆盖了_Java_Swing_Jframe_Jpanel_Jbutton - Fatal编程技术网

Java 按钮似乎被视频覆盖了

Java 按钮似乎被视频覆盖了,java,swing,jframe,jpanel,jbutton,Java,Swing,Jframe,Jpanel,Jbutton,我正试图写一个程序,用网络摄像头捕捉照片。我想在实况视频的JFrame中添加一个JButton。然而,按钮并没有出现。我相信这段视频已经报道过了。我在下面附上了我的代码 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.Graphics; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel;

我正试图写一个程序,用网络摄像头捕捉照片。我想在实况视频的JFrame中添加一个JButton。然而,按钮并没有出现。我相信这段视频已经报道过了。我在下面附上了我的代码

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyFrame extends JFrame {
private JPanel contentPane;


/**
 * Launch the application.
 */
public static void main(String[] args) {
    MyFrame frame = new MyFrame();
    frame.contentPane.add(new JButton("Camera"));
    frame.setVisible(true);
}
 // Create the frame.
public MyFrame() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 650, 490);      
    contentPane = new JPanel();
    setContentPane(contentPane);
    contentPane.setLayout(null);
    new MyThread().start();
}
VideoCap videoCap = new VideoCap();
public void paintComponent(Graphics g){
    g = contentPane.getGraphics();
    g.drawImage(videoCap.getOneFrame(), 0, 0, this);
}
class MyThread extends Thread{
    @Override
    public void run() {
        for (;;){
            repaint();
            try { Thread.sleep(30);
            } catch (InterruptedException e) {    }
        }  
    } 
}
}
任何建议都会很棒。
我看了很多关于Jbuttons没有出现的问题,但我不确定哪一个与我的类似。如果有,请告诉我正确的方向


提前感谢。

您正在将按钮添加到内容窗格,然后在其上绘制视频。当然,视频会覆盖你的按钮

一些建议:

  • 不要设置自定义内容窗格

  • 创建两个单独的面板并将其添加到内容窗格

  • 将按钮添加到一个面板

  • 将您的视频绘制到另一个视频上

  • 重构代码以正确覆盖
    paintComponent
    ,并从另一个线程重新绘制它


  • 您正在将按钮添加到内容窗格,然后在其上绘制视频。当然,视频会覆盖你的按钮

    一些建议:

  • 不要设置自定义内容窗格

  • 创建两个单独的面板并将其添加到内容窗格

  • 将按钮添加到一个面板

  • 将您的视频绘制到另一个视频上

  • 重构代码以正确覆盖
    paintComponent
    ,并从另一个线程重新绘制它


  • 我不确定您正在使用哪个库来创建上述视频。虽然在本例中,我使用了
    opencv
    库从网络摄像头创建图像。为了使它适合您的用例,您必须修改它

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.image.BufferedImage;
    import java.awt.image.DataBufferByte;
    import java.awt.image.WritableRaster;
    import java.io.ByteArrayInputStream;
    import java.io.File;
    import java.io.InputStream;
    
    import javax.imageio.ImageIO;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    import org.opencv.core.*;     
    import org.opencv.videoio.VideoCapture;
    
    public class ApplicationBase {
    
        private BufferedImage m_Captured_BufferedImage;
    
        static {
            System.out.println(System.getProperty("java.library.path"));
            System.loadLibrary ( Core.NATIVE_LIBRARY_NAME );
        }
    
        private void displayGUI ( BufferedImage image, String title, int x, int y ) {
            JFrame frame = new JFrame ( title );
            frame.setDefaultCloseOperation ( JFrame.DISPOSE_ON_CLOSE );
    
            JPanel contentPane = new JPanel ( new BorderLayout ( 5, 5 ) );
    
            PictureDrawer pictureDrawer = new PictureDrawer ( image );
            contentPane.add ( pictureDrawer, BorderLayout.CENTER );
    
            JButton button = new JButton ( "Click Me not!" );
            contentPane.add ( button, BorderLayout.PAGE_END );
    
            frame.setContentPane ( contentPane );
            frame.pack ();
            frame.setLocationByPlatform ( true );
            frame.setVisible ( true );
        }
    
        private void startApp () {
            VideoCapture camera = new VideoCapture ( 0 );
    
            Mat videoFrame = new Mat ();
            camera.read ( videoFrame );
    
            if ( camera.read ( videoFrame ) ) {
                m_Captured_BufferedImage = matToBufferedImage ( videoFrame );
                Runnable runnable = new Runnable () {
                    @Override
                    public void run () {
                        displayGUI ( m_Captured_BufferedImage, "Image", 0, 0 );
                    }
                };                  
                EventQueue.invokeLater ( runnable );
            }
            camera.release ();
        }
    
        public BufferedImage matToBufferedImage ( Mat videoFrame ) {
            //Mat() to BufferedImage
            int type = 0;
            if ( videoFrame.channels () == 1 ) {
                type = BufferedImage.TYPE_BYTE_GRAY;
            } else if ( videoFrame.channels () == 3 ) {
                type = BufferedImage.TYPE_3BYTE_BGR;
            }
            BufferedImage image = new BufferedImage ( videoFrame.width (), videoFrame.height (), type );
            WritableRaster raster = image.getRaster ();
            DataBufferByte dataBuffer = ( DataBufferByte ) raster.getDataBuffer ();
            byte [] data = dataBuffer.getData ();
            videoFrame.get ( 0, 0, data );
    
            return image;
        }
    
        public static void main ( String [] args ) {
            new ApplicationBase ().startApp ();
        }
    }
    
    class PictureDrawer extends JComponent {
    
        private BufferedImage m_BufferedImage;
    
        public PictureDrawer ( BufferedImage bufferedImage ) {
            this.m_BufferedImage = bufferedImage;
        }
    
        @Override
        protected void paintComponent ( Graphics g ) {
            super.paintComponent ( g );
            g.drawImage ( m_BufferedImage, 0, 0, this );
        }
    
        @Override
        public Dimension getPreferredSize () {
            return new Dimension ( m_BufferedImage.getWidth (), m_BufferedImage.getHeight () );
        }
    }
    
    我从下载了OpenCV库

    使用以下命令编译项目:

    javac -classpath .;C:\install\opencv\opencv\build\java\opencv-320.jar; -d bin source\*.java
    
    运行项目的命令:

    >java -classpath .;C:\install\opencv\opencv\build\java\opencv-320.jar; -Djava.library.path=C:\install\opencv\opencv\build\java\x64 ApplicationBase
    

    我不确定您正在使用哪个库来创建上述视频。虽然在本例中,我使用了
    opencv
    库从网络摄像头创建图像。为了使它适合您的用例,您必须修改它

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.image.BufferedImage;
    import java.awt.image.DataBufferByte;
    import java.awt.image.WritableRaster;
    import java.io.ByteArrayInputStream;
    import java.io.File;
    import java.io.InputStream;
    
    import javax.imageio.ImageIO;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    import org.opencv.core.*;     
    import org.opencv.videoio.VideoCapture;
    
    public class ApplicationBase {
    
        private BufferedImage m_Captured_BufferedImage;
    
        static {
            System.out.println(System.getProperty("java.library.path"));
            System.loadLibrary ( Core.NATIVE_LIBRARY_NAME );
        }
    
        private void displayGUI ( BufferedImage image, String title, int x, int y ) {
            JFrame frame = new JFrame ( title );
            frame.setDefaultCloseOperation ( JFrame.DISPOSE_ON_CLOSE );
    
            JPanel contentPane = new JPanel ( new BorderLayout ( 5, 5 ) );
    
            PictureDrawer pictureDrawer = new PictureDrawer ( image );
            contentPane.add ( pictureDrawer, BorderLayout.CENTER );
    
            JButton button = new JButton ( "Click Me not!" );
            contentPane.add ( button, BorderLayout.PAGE_END );
    
            frame.setContentPane ( contentPane );
            frame.pack ();
            frame.setLocationByPlatform ( true );
            frame.setVisible ( true );
        }
    
        private void startApp () {
            VideoCapture camera = new VideoCapture ( 0 );
    
            Mat videoFrame = new Mat ();
            camera.read ( videoFrame );
    
            if ( camera.read ( videoFrame ) ) {
                m_Captured_BufferedImage = matToBufferedImage ( videoFrame );
                Runnable runnable = new Runnable () {
                    @Override
                    public void run () {
                        displayGUI ( m_Captured_BufferedImage, "Image", 0, 0 );
                    }
                };                  
                EventQueue.invokeLater ( runnable );
            }
            camera.release ();
        }
    
        public BufferedImage matToBufferedImage ( Mat videoFrame ) {
            //Mat() to BufferedImage
            int type = 0;
            if ( videoFrame.channels () == 1 ) {
                type = BufferedImage.TYPE_BYTE_GRAY;
            } else if ( videoFrame.channels () == 3 ) {
                type = BufferedImage.TYPE_3BYTE_BGR;
            }
            BufferedImage image = new BufferedImage ( videoFrame.width (), videoFrame.height (), type );
            WritableRaster raster = image.getRaster ();
            DataBufferByte dataBuffer = ( DataBufferByte ) raster.getDataBuffer ();
            byte [] data = dataBuffer.getData ();
            videoFrame.get ( 0, 0, data );
    
            return image;
        }
    
        public static void main ( String [] args ) {
            new ApplicationBase ().startApp ();
        }
    }
    
    class PictureDrawer extends JComponent {
    
        private BufferedImage m_BufferedImage;
    
        public PictureDrawer ( BufferedImage bufferedImage ) {
            this.m_BufferedImage = bufferedImage;
        }
    
        @Override
        protected void paintComponent ( Graphics g ) {
            super.paintComponent ( g );
            g.drawImage ( m_BufferedImage, 0, 0, this );
        }
    
        @Override
        public Dimension getPreferredSize () {
            return new Dimension ( m_BufferedImage.getWidth (), m_BufferedImage.getHeight () );
        }
    }
    
    我从下载了OpenCV库

    使用以下命令编译项目:

    javac -classpath .;C:\install\opencv\opencv\build\java\opencv-320.jar; -d bin source\*.java
    
    运行项目的命令:

    >java -classpath .;C:\install\opencv\opencv\build\java\opencv-320.jar; -Djava.library.path=C:\install\opencv\opencv\build\java\x64 ApplicationBase
    

    MyFrame=newmyframe();frame.setVisible(true)添加所有组件并在显示帧之前将其
    pack()
    打包。其他提示:1)为了更快地获得更好的帮助,发布一个或。2) 在源代码中只需要一行空白就可以了。
    {
    之后或
    }
    之前的空行通常也是多余的。3) 请参阅,了解一个我不再费心修复的问题。首先将所有组件添加到
    JFrame
    ,然后将其visible属性设置为
    true
    。其次,在
    MyFrame
    构造函数中,您正在为所述
    JFrame
    设置
    contentPane
    ,尽管
    main
    方法中完全忽略了对
    contentPane
    的引用。如果不知道发生了什么,就不要使用继承?最后,在
    main'中,您使用了带有默认布局的
    JPanel',并使用
    BorderLayout
    约束向其添加
    JButton
    !!这让我非常惊讶:(
    public void paint(Graphics g){g=contentPane.getGraphics();g.drawImage(videoCap.getOneFrame(),0,0,this);}
    Wow..这在很多方面都很糟糕。1)不要调用
    getGraphics
    (除了在
    BufferedImage
    上)2)在框架顶部添加了一个面板,因此,框架中的任何自定义绘画都将不可见。3) 在
    JComponent
    (如
    JPanel
    )中重写
    paintComponent(Graphics)
    比在顶级容器(如
    JFrame
    )中重写
    paintComponent(Graphics)
    要好得多。。面板.添加(按钮,边框布局.中心)
    A
    JPanel
    默认具有
    FlowLayout
    。上面的代码表明你是“用魔法编码”——只是把一组随机的代码行扔在一起,希望逻辑会意外出现。小贴士:不会的。@AndrewThompson我感谢你对问题格式的建议,并做了必要的修改。让我花点时间来消化你的建议<代码>MyFrame=新建MyFrame();frame.setVisible(true)添加所有组件并在显示帧之前将其
    pack()
    打包。其他提示:1)为了更快地获得更好的帮助,发布一个或。2) 在源代码中只需要一行空白就可以了。
    {
    之后或
    }
    之前的空行通常也是多余的。3) 请参阅,了解一个我不再费心修复的问题。首先将所有组件添加到
    JFrame
    ,然后将其visible属性设置为
    true
    。其次,在
    MyFrame
    构造函数中,您正在为所述
    JFrame
    设置
    contentPane
    ,尽管
    main
    方法中完全忽略了对
    contentPane
    的引用。如果不知道发生了什么,就不要使用继承?最后,在
    main'中,您使用了带有默认布局的
    JPanel',并使用
    BorderLayout
    约束向其添加
    JButton
    !!这让我非常惊讶:(
    public void paint(Graphics g){g=contentPane.getGraphics();g.drawImage(videoCap.getOneFrame(),0,0,this);}
    Wow..这在很多方面都很糟糕。1)不要调用
    getGraphics
    (除了在
    BufferedImage
    上)2)在框架顶部添加了一个面板,因此,框架中的任何自定义绘画都将不可见。3) 在
    JComponent
    (如
    JPanel
    )中重写
    paintComponent(Graphics)
    比在顶级容器(如
    JFrame
    )中重写
    paintComponent(Graphics)
    要好得多。。面板.添加(按钮,边框布局.中心)
    A
    JPanel
    默认具有
    FlowLayout
    。上面的代码表明你是“鳕鱼”