Cannot invoke "javax.swing.JButton.addActionListener(java.awt.event.ActionListener)" because "this.convertcelsiustofahrenheitBotton" is null
时间: 2024-02-05 10:11:17 浏览: 239
这个错误提示意味着你正在尝试调用一个 `JButton` 对象的 `addActionListener()` 方法,但是该对象并没有被正确地初始化(即为 `null`)。这可能是由于你在调用 `addActionListener()` 方法之前忘记初始化按钮对象或者初始化出现了错误所致。
请确保你已经正确地初始化了 `convertcelsiustofahrenheitBotton` 对象,并且它不是 `null`。你可以通过在使用 `addActionListener()` 方法之前添加一个非空检查来避免该错误:
```
if (convertcelsiustofahrenheitBotton != null) {
convertcelsiustofahrenheitBotton.addActionListener(listener);
}
```
如果你仍然无法解决问题,请检查代码中其他可能导致该对象为 `null` 的地方。
相关问题
java连接摄像头_Java实现 海康摄像头抓拍图像(示例代码)
以下是连接海康摄像头并抓取图像的Java示例代码:
```java
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.NativeLongByReference;
import com.sun.jna.win32.StdCallLibrary;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class HkCameraDemo extends JFrame implements StdCallLibrary.StdCallCallback {
private static final int WIDTH = 640; // 图像宽度
private static final int HEIGHT = 480; // 图像高度
private static final int CHANNEL = 1; // 通道数
private static final int BUFFER_SIZE = 2 * WIDTH * HEIGHT * CHANNEL; // 缓存大小
private NativeLong userId; // 用户ID
private NativeLong realPlayHandle; // 实时预览句柄
private BufferedImage image; // 图像数据
public interface PlayCtrl extends StdCallLibrary {
PlayCtrl INSTANCE = (PlayCtrl) com.sun.jna.Native.loadLibrary("PlayCtrl", PlayCtrl.class);
interface PlayM4CallBack extends StdCallCallback {
void invoke(NativeLong lPort, Pointer pBuf, int nSize, Pointer pUser);
}
boolean PlayM4_GetPort(NativeLongByReference nPort);
boolean PlayM4_OpenStream(NativeLong nPort, Pointer pBuf, int nSize, int nBufPoolSize);
boolean PlayM4_SetDecodeParam(NativeLong nPort, Pointer pDecodeParam);
boolean PlayM4_Play(NativeLong nPort, HWND hWnd);
boolean PlayM4_Stop(NativeLong nPort);
boolean PlayM4_CloseStream(NativeLong nPort);
boolean PlayM4_FreePort(NativeLong nPort);
}
interface HCNetSDK extends StdCallLibrary {
HCNetSDK INSTANCE = (HCNetSDK) com.sun.jna.Native.loadLibrary("HCNetSDK", HCNetSDK.class);
boolean NET_DVR_Init();
boolean NET_DVR_Cleanup();
NativeLong NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, Pointer lpDeviceInfo);
boolean NET_DVR_Logout(NativeLong lUserID);
NativeLong NET_DVR_RealPlay_V30(NativeLong lUserID, HCNetSDK.NET_DVR_CLIENTINFO lpClientInfo, PlayCtrl.PlayM4CallBack fRealDataCallBack_V30, Pointer pUser, boolean bBlocked);
boolean NET_DVR_StopRealPlay(NativeLong lRealHandle);
boolean NET_DVR_GetLastError();
boolean NET_DVR_CaptureJPEGPicture(NativeLong lUserID, NativeLong lChannel, HCNetSDK.NET_DVR_JPEGPARA lpJpegPara, String sPicFileName);
boolean NET_DVR_SaveRealData(NativeLong lRealHandle, String sFileName);
public static class NET_DVR_DEVICEINFO_V30 extends Structure {
public byte[] sSerialNumber = new byte[48]; // 序列号
public byte byAlarmInPortNum; // 模拟报警输入个数
public byte byAlarmOutPortNum; // 模拟报警输出个数
public byte byDiskNum; // 硬盘个数
public byte byDVRType; // 设备类型
public byte byChanNum; // 设备模拟通道个数
public byte byStartChan; // 起始通道号,从1开始计数
public byte byAudioChanNum; // 设备语音对讲通道数
public byte byIPChanNum; // 设备最大数字通道个数
public byte[] byRes2 = new byte[24]; // 保留
}
public static class NET_DVR_JPEGPARA extends Structure {
public int wPicSize; // 图片尺寸
public int wPicQuality; // 图片质量
}
public static class NET_DVR_CLIENTINFO extends Structure {
public NativeLong lChannel; // 预览通道号
public NativeLong hPlayWnd; // 播放窗口的句柄
public int lLinkMode; // 连接方式:0-TCP,1-UDP,2-MCAST,3-RTP
public Pointer sMultiCastIP; // 多播地址
}
}
public HkCameraDemo() {
setTitle("海康摄像头");
setBounds(100, 100, WIDTH, HEIGHT + 50);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton btnCapture = new JButton("抓图");
btnCapture.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 抓图保存为文件
if (image != null) {
String fileName = System.currentTimeMillis() + ".jpg";
File file = new File(fileName);
try {
javax.imageio.ImageIO.write(image, "jpg", file);
JOptionPane.showMessageDialog(null, "抓图成功,保存为:" + file.getAbsolutePath());
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
});
getContentPane().add(btnCapture);
setVisible(true);
// 初始化SDK
HCNetSDK.INSTANCE.NET_DVR_Init();
// 登录设备
HCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
String ipAddress = "192.168.1.64"; // 摄像头IP地址
short port = 8000; // 摄像头端口
String userName = "admin"; // 登录用户名
String password = "admin123456"; // 登录密码
userId = HCNetSDK.INSTANCE.NET_DVR_Login_V30(ipAddress, port, userName, password, deviceInfo);
if (userId.intValue() < 0) {
JOptionPane.showMessageDialog(null, "登录设备失败");
return;
}
// 预览
HCNetSDK.NET_DVR_CLIENTINFO clientInfo = new HCNetSDK.NET_DVR_CLIENTINFO();
clientInfo.lChannel = new NativeLong(1); // 预览通道号
clientInfo.hPlayWnd = Pointer.createConstant(0); // 播放窗口的句柄
clientInfo.lLinkMode = 0; // 连接方式:0-TCP,1-UDP,2-MCAST,3-RTP
clientInfo.sMultiCastIP = Pointer.createConstant(""); // 多播地址
PlayCtrl.PlayM4CallBack callback = this; // 回调函数
realPlayHandle = HCNetSDK.INSTANCE.NET_DVR_RealPlay_V30(userId, clientInfo, callback, null, true);
}
@Override
public void invoke(NativeLong lPort, Pointer pBuf, int nSize, Pointer pUser) {
// 解码显示图像
byte[] bytes = pBuf.getByteArray(0, nSize);
image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_BYTE_GRAY);
image.getRaster().setDataElements(0, 0, WIDTH, HEIGHT, bytes);
repaint();
}
@Override
public void paint(java.awt.Graphics g) {
// 显示图像
if (image != null) {
g.drawImage(image, 0, 0, null);
}
}
public static void main(String[] args) {
new HkCameraDemo();
}
}
```
注意,上述代码中需要替换以下内容:
1. `ipAddress`:摄像头IP地址;
2. `port`:摄像头端口;
3. `userName`:登录用户名;
4. `password`:登录密码;
5. `clientInfo.lChannel`:预览通道号。
该代码中,使用海康SDK登录设备并进行实时预览,通过回调函数获得图像数据并解码显示。同时,还提供了抓图功能,将当前图像保存为JPG格式的文件。
需要注意的是,该代码使用了JNA库调用海康SDK和PlayCtrl库,需要将对应的DLL文件放到程序运行路径下。另外,该代码仅适用于海康摄像头,不适用于其他品牌的摄像头。
阅读全文