如何在java应用程序启动时自动执行方法?

vsikbqxv  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(458)

我正在构建一个小的java应用程序,用于从usb相机加载图像,或者在找不到usb相机时显示错误消息(图像)。应用程序需要自动加载并启动“captureimage()”,但在“captureimage()”方法下出现nullpointerexception错误。
如果我通过单击gui上的按钮调用“captureimage()”(而不是通过启动线程在“initialize()”中启动它),那么它可以正常工作。任何关于如何正确处理的指导都将不胜感激。

  1. public class WebcamCapture_gui {
  2. JFrame frmWebcamCapture_gui;
  3. static Canvas canvas = new Canvas();
  4. JPanel panel = new JPanel();
  5. static Image notFound = null;
  6. static boolean running = true;
  7. public static void main(String[] args) {
  8. EventQueue.invokeLater(new Runnable() {
  9. public void run() {
  10. try {
  11. WebcamCapture_gui window = new WebcamCapture_gui();
  12. window.frmWebcamCapture_gui.setVisible(true);
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. }
  16. }
  17. });
  18. }
  19. public WebcamCapture_gui() throws IOException {
  20. initialize();
  21. }
  22. private void initialize() {
  23. JButton btnNewButton = new JButton("OK", new ImageIcon(WebcamCapture_gui.class.getResource("/resources/ok-32.png")));
  24. btnNewButton.setFont(new Font("Lucida Grande", Font.BOLD, 16));
  25. btnNewButton.setMnemonic('o');
  26. btnNewButton.addActionListener(new ActionListener() {
  27. public void actionPerformed(ActionEvent e) {
  28. CaptureImage();
  29. }
  30. });
  31. btnNewButton.setBounds(918, 573, 156, 83);
  32. canvas.setBounds(6, 6, 1052, 547);
  33. frmWebcamCapture_gui = new JFrame();
  34. frmWebcamCapture_gui.setResizable(false);
  35. frmWebcamCapture_gui.setUndecorated(true);
  36. frmWebcamCapture_gui.setTitle("Camera Test");
  37. frmWebcamCapture_gui.setSize(1080, 662);
  38. frmWebcamCapture_gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  39. frmWebcamCapture_gui.getContentPane().setLayout(null);
  40. panel.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
  41. panel.setBounds(6, 6, 1068, 563);
  42. panel.setLayout(null);
  43. panel.add(canvas);
  44. frmWebcamCapture_gui.getContentPane().add(panel);
  45. frmWebcamCapture_gui.getContentPane().add(btnNewButton);
  46. File classPathInput = new File(WebcamCapture_gui.class.getResource("/resources/USB_not_found.png").getFile());
  47. try {
  48. notFound = ImageIO.read(classPathInput);
  49. } catch (IOException e) {
  50. // TODO Auto-generated catch block
  51. e.printStackTrace();
  52. }
  53. /*
  54. * If I remove this Thread start and use the button to call 'CaptureImage()' instead, then the images will load and no NPE.
  55. */
  56. Thread t1 = new Thread(new thread1());
  57. t1.start();
  58. try {
  59. t1.join();
  60. } catch (Exception e1) {
  61. System.out.println(e1);
  62. }
  63. }
  64. public static class thread1 implements Runnable {
  65. @Override
  66. public void run() {
  67. CaptureImage();
  68. }
  69. }
  70. public static void CaptureImage() {
  71. Graphics g = canvas.getGraphics();
  72. Webcam webcam = Webcam.getDefault();
  73. if (webcam != null) {
  74. webcam.open();
  75. g.drawImage(webcam.getImage(), 0, 0, 1060, 554, null);
  76. webcam.close();
  77. } else {
  78. g.drawImage(notFound, 0, 0, 1060, 547, null);
  79. }
  80. }
  81. }

堆栈跟踪:

  1. javax.imageio.IIOException: Can't read input file!
  2. at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1308)
  3. at webcamCapture.WebcamCapture_gui.initialize(WebcamCapture_gui.java:80)
  4. at webcamCapture.WebcamCapture_gui.<init>(WebcamCapture_gui.java:44)
  5. at webcamCapture.WebcamCapture_gui$1.run(WebcamCapture_gui.java:34)
  6. at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:316)
  7. at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
  8. at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
  9. at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
  10. at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
  11. at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
  12. at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
  13. at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
  14. at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
  15. at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
  16. at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
  17. at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
  18. at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
  19. [Thread-0] INFO com.github.sarxos.webcam.Webcam - WebcamDefaultDriver capture driver will be used
  20. [Thread-0] WARN com.github.sarxos.webcam.Webcam - No webcam has been detected!
  21. Exception in thread "Thread-0" java.lang.NullPointerException: Cannot invoke "java.awt.Graphics.drawImage(java.awt.Image, int, int, int, int, java.awt.image.ImageObserver)" because "g" is null
  22. at webcamCapture.WebcamCapture_gui.CaptureImage(WebcamCapture_gui.java:120)
  23. at webcamCapture.WebcamCapture_gui$thread1.run(WebcamCapture_gui.java:102)
  24. at java.base/java.lang.Thread.run(Thread.java:832)
6yjfywim

6yjfywim1#

请注意,错误不仅仅是由图像引起的。

  1. Exception in thread "Thread-0" java.lang.NullPointerException: Cannot invoke "java.awt.Graphics.drawImage(java.awt.Image, int, int, int, int, java.awt.image.ImageObserver)" because "g" is null
  2. at webcamCapture.WebcamCapture_gui.CaptureImage(WebcamCapture_gui.java:120)
  3. at webcamCapture.WebcamCapture_gui$thread1.run(WebcamCapture_gui.java:102)
  4. at java.base/java.lang.Thread.run(Thread.java:832)

当您立即启动线程时,画布图形可能尚未初始化并调用 drawImage 方法提高了npe。
为了规避npe,你可以

  1. t1.start();

具有

  1. SwingUtilities.invokeLater(t1);

另一个“肮脏”的解决方法是离开t1.start();但是通过添加frmwebcamcapture\u gui.setvisible(true)来强制应用程序加载其组件;在thread1的run方法中

  1. public class thread1 implements Runnable {
  2. @Override
  3. public void run() {
  4. frmWebcamCapture_gui.setVisible(true);
  5. CaptureImage();
  6. }
  7. }

这主要是为了演示和爆炸的目的,所以我建议您采用第一种使用 SwingUtilities . 您可以在本文和文档中阅读更多关于swingutilities.invokelater的信息

展开查看全部

相关问题