1

Bluetooth経由でコンピューターとarduinoを接続するアプリを作成しようとしています。これまでのところはうまくいっていました (0 または 1 を送信するための単純なボタンがあり、接続はスムーズに行われていました) が、キー リスナーを追加すると、接続直後に応答しなくなりました。基本的には次のようなものです: - [実行] をクリックすると、アプリが開き、ボタンをクリックできます。キーボードのキーを押すと、接続されていないという情報が表示されます - [接続] をクリックします - Bluetooth 経由で接続されています - まだ接続できますボタンをクリックします (現在は何もしません) が、キーを押すとすぐに何もできません。「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;

また、ここにメインクラス全体があります: public class Communication{

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);
4

0 に答える 0