Java 按钮似乎被视频覆盖了
我正试图写一个程序,用网络摄像头捕捉照片。我想在实况视频的JFrame中添加一个JButton。然而,按钮并没有出现。我相信这段视频已经报道过了。我在下面附上了我的代码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;
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)
要好得多。。面板.添加(按钮,边框布局.中心)
AJPanel
默认具有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)
要好得多。。面板.添加(按钮,边框布局.中心)
AJPanel
默认具有FlowLayout
。上面的代码表明你是“鳕鱼”