我正在尝试制作一个应用程序来通过蓝牙将计算机与 arduino 连接起来。到目前为止一切顺利(我有简单的按钮来发送 0 或 1 并且连接进展顺利),但是当我添加关键侦听器时,它在连接后立即停止响应。基本上是这样的: - 我点击“运行”,应用程序打开,我可以点击按钮,我可以按下键盘上的键,我得到我未连接的信息 - 点击“连接” - 它通过蓝牙连接 - 我仍然可以点击按钮(现在什么都不做),但只要我按下一个键,我就什么也做不了——甚至点击一个“x”来关闭它。看起来框架失去了焦点,所以我在接受框架的所有内容上将焦点设置为 false。我不知道问题可能出在哪里......
这是连接按钮的代码:
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(!connected){
textArea.append("Connecting to the device on port "+ selectedCOM + "....\n");
try {
serialPort = new SerialPort(selectedCOM);
textArea.append("Port opened: " + serialPort.openPort() + "\n");
textArea.append("Params set: " + serialPort.setParams(4800, 8, 1, 0) + "\n");
textArea.append("Connected succesfully!\n");
connected = true;
} catch (SerialPortException e1) {
//e1.printStackTrace();
textArea.append("Error: "+e1.getExceptionType()+"\n");
}
} else {
textArea.append("You can't do that, you are already connected!\n");
}
}
});
和一个关键监听器的片段(其余的,如果类比的话):
addKeyListener(new KeyListener(){
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_UP) {
up.getModel().setPressed(true);
if(connected){
try {
serialPort.writeInt(FORWARD);
System.out.println(FORWARD);
} catch (SerialPortException e1) {
textArea.append("Error: "+e1.getExceptionType()+"\n");
e1.printStackTrace();
}
}
else {
textArea.append("You are not connected.\n");
}
FORWARD 定义为 1 :
private final int FORWARD = 1;
这也是整个主类:公共类通信{
private static void createAndShowGUI() {
//Create and set up the window.
Frame frame = new Frame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Display the window.
frame.setFocusable(true);
frame.setSize(new Dimension(600,600));
frame.setLayout(new GridLayout());
frame.setLocation(500, 250);
frame.setResizable(false);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args)
{
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
整个 Frame 类(它扩展了 JFrame)大约有 300 行,所以我不想在这里全部发布。如果它有帮助,它就在这里
编辑:按照评论中的建议,我将关键侦听器更改为与摇摆工人的键绑定,但它仍然没有响应。我认为连接可能存在一些错误,但我不知道如何解决它们......
代码的变化:
forwardAction = new AbstractAction(){
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
SwingWorker<Void,Integer> worker = new SwingWorker<Void,Integer>(){
@Override
protected Void doInBackground() throws Exception {
goForward();
return null;
}
};
worker.execute();
}
};
pane.getInputMap(IFW).put(KeyStroke.getKeyStroke("UP"), MOVE_FORWARD);
pane.getActionMap().put(MOVE_FORWARD,forwardAction);