2015-12-01 39 views
0

我正在创建一个应用程序以从网络摄像头抓取框架。我使用jpanel(用于显示网络摄像头)和两个按钮设计了net beans中的GUI。但是运行程序时按钮不可见。我该如何解决这个问题?JButton在运行框架时丢失了

public class NewJFrame extends javax.swing.JFrame { 


int count=0; 
public NewJFrame() { 


    initComponents(); 
} 


@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

    jPanel1 = new javax.swing.JPanel(); 
    jPanel2 = new javax.swing.JPanel(); 
    jButton1 = new javax.swing.JButton(); 
    jButton2 = new javax.swing.JButton(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); 
    jPanel1.setLayout(jPanel1Layout); 
    jPanel1Layout.setHorizontalGroup(
     jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 0, Short.MAX_VALUE) 
    ); 
    jPanel1Layout.setVerticalGroup(
     jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 472, Short.MAX_VALUE) 
    ); 

    jButton1.setText("Camera"); 
    jButton1.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      jButton1ActionPerformed(evt); 
     } 
    }); 

    jButton2.setText("Grab Frame"); 

    javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); 
    jPanel2.setLayout(jPanel2Layout); 
    jPanel2Layout.setHorizontalGroup(
     jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(jPanel2Layout.createSequentialGroup() 
      .addGap(23, 23, 23) 
      .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) 
       .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
       .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
      .addContainerGap(456, Short.MAX_VALUE)) 
    ); 
    jPanel2Layout.setVerticalGroup(
     jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(jPanel2Layout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(jButton1) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(jButton2) 
      .addContainerGap(37, Short.MAX_VALUE)) 
    ); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
       .addGroup(layout.createSequentialGroup() 
        .addContainerGap() 
        .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) 
      .addContainerGap()) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(18, 18, 18) 
      .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(0, 0, Short.MAX_VALUE)) 
    ); 

    pack(); 
}// </editor-fold>       

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    // TODO add your handling code here: 
    jButton2.setVisible(true); 
    new camThread().start(); 
}           



class camThread extends Thread{ 
    @Override 
    public void run() { 
     for (;;){ 
      repaint(); 
      try { Thread.sleep(30); 
      } catch (InterruptedException e) { } 
     } 
    } 
} 

VideoCap videoCap = new VideoCap(); 
public void paint(Graphics g){ 
    g = jPanel1.getGraphics(); 
    g.drawImage(videoCap.getOneFrame(), 0, 0, jPanel1); 
} 
public static void main(String args[]) { 


    try { 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (ClassNotFoundException ex) { 
     java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (InstantiationException ex) { 
     java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
     java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } 
    //</editor-fold> 

    /* Create and display the form */ 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new NewJFrame().setVisible(true); 
     } 
    }); 
} 

// Variables declaration - do not modify      
private javax.swing.JButton jButton1; 
private javax.swing.JButton jButton2; 
private javax.swing.JPanel jPanel1; 
private javax.swing.JPanel jPanel2; 
// End of variables declaration     } 
+0

所以,你已经重写框架的'paint'方法,没有打电话'super.paint '似乎想知道为什么它不起作用。也许你应该先看看[在AWT和Swing中绘画](http://www.oracle.com/technetwork/java/painting-140037.html)和 [执行自定义绘画](http:// docs .oracle.com/javase/tutorial/uiswing/painting /)了解绘画在Swing中的工作原理 – MadProgrammer

+0

好的,还有其他方法可以从网络摄影机绘制框架吗? – Bhavisankar

+0

可能有数百个,但我不知道你是如何捕捉帧或以什么格式 – MadProgrammer

回答

2

这...

public void paint(Graphics g) { 
    g = jPanel1.getGraphics(); 
    g.drawImage(videoCap.getOneFrame(), 0, 0, jPanel1); 
} 

应该是...

//public void paint(Graphics g) { 
// g = jPanel1.getGraphics(); 
// g.drawImage(videoCap.getOneFrame(), 0, 0, jPanel1); 
//} 

这是不是你在Swing做的风俗画。

如果getOneFrame正在恢复某种形象,那么你可以简单地使用JLabel来显示它

这...

class camThread extends Thread { 

    @Override 
    public void run() { 
     for (;;) { 
      repaint(); 
      try { 
       Thread.sleep(30); 
      } catch (InterruptedException e) { 
      } 
     } 
    } 
} 

可以用一个Swing TimerSwingWorker被取代,可能会使用Swing更安全

看一看:

更多细节