Java:发送和接收KeyEvent.VK_BACK_SPACE结果to/from串口

Java: Send and receive KeyEvent.VK_BACK_SPACE results to/from serial

我的目标有点复杂,我不确定它是否可行。但是我正在为我工​​作的公司制作终端程序。

所以程序是这样构建的(至少,重要的部分)。 我有一个 JTextArea 正在接收使用 JSSC 库从串行读取的字节。这个 JTextArea 有一个按键侦听器,它侦听按键并使用 SerialPort.writeInt(event.getKeyCode());.getKeyChar(); 将每个按键作为 int 发送到串行,我不记得了,但我认为它是 getKeyChar();。当我在 JTextArea 上按 Backspace 时,假设我输入了 reset halt 以将控制模块重置为出厂默认设置并停止它。如果我按 Backspace 2 次,在实际的控制模块中,它会执行 "Backspace" 2 个字符,但在 JTextArea 上它仍会显示 reset halt PLUS(我主要想修复的部分)[K 每次我按 Backspace。所以...

  1. 我输入 reset halt.
  2. 我按Backspace 2 次。
  3. 我的 JTextArea 上的结果是 reset halt[K[K
  4. 实际控制模块的结果(我看不到结果)是 reset ha 应该的。

我认为这可能是我使用的键码,所以我做了一个 if 语句来更改当我按下 Backspace 时通过串口发送的内容。

if(event.getKeyCode() == KeyEvent.VK_BACK_SPACE){
    SerialPort.writeInt(127); //Decimal for Delete
    //And (not at the same time)
    SerialPort.writeInt(8); //Decimal for Backspace (from ASCII code)
}

当然我错了,问题依然存在。

所以我的问题是:

  1. 是否可以通过阅读连载"update" 我的 JTextArea 中的内容 "Backspaced"?
  2. 如何防止讨厌的 [K 出现在我的主机上 (JTextArea)。

我不需要你为我完成工作,只要你能把我推向正确的方向。

我很抱歉没有把我的大部分代码放在这个问题上。 "security reasons" 我在家,工作区没有互联网(令人震惊)。如果您需要更多代码,请告诉我,如果可以的话,我会尽量添加!

我还有一个附带问题,想在我的控制台中 add/change (JTextArea)。我不知道它的技术术语,但我想增加我控制台上打字光标的宽度,以便它更明显,不是鼠标光标,而是当您单击文本字段时显示的闪烁光标。那个光标叫什么?

这是一个例子。

字符串是使用 MyTestPanel 的图形对象绘制的。绘图是在 MyTestPanel 的 paintComponent() 中完成的。

此面板也检测到按键事件。由于这没有任何默认行为,您可以自由地使用给定的输入执行您想要的操作。

我还没有处理水平滚动和面板动态宽度。

测试框架2

import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.SwingUtilities;

public class TestFrame2 {
    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                createAndShow();
            }
        });
    }

    public static void createAndShow() {
        JFrame frame = new JFrame("Test Frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final MyTestPanel panel = new MyTestPanel();

        //add any other components like buttons, labels to panel

        JScrollPane scrollPane = new JScrollPane(panel);
        scrollPane.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
        panel.setParentPane(scrollPane);
        scrollPane.setPreferredSize(new Dimension(700, 300));
        frame.add(scrollPane);

        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
                //panel.stopCursorThread();
            }
        });
        //frame.setSize(300, 300);
        frame.pack();
        //frame.setSize(frame.getWidth(), frame.getHeight());
        frame.setLocationRelativeTo(null);
        System.out.println(frame.getWidth() + " : " + frame.getHeight());
        frame.setVisible(true);
        //panel.startCursorThread();
    }
}

MyTestPanel

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;

public class MyTestPanel extends JPanel {
    final int LINE_HEIGHT = 20;
    final int START_X = 20;
    final int START_Y = 20;
    //private int lastLineY;

    final List<String> lines = new ArrayList<String>();
    final StringBuilder lastLine = new StringBuilder();
    private JScrollPane parentPane;
    //Thread cursorThread;
    //private AtomicBoolean keepRunningCursor = new AtomicBoolean(true);

    String validCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,.\/:;<=>?@[] ^_`{|}~-]*$";

    /*public static void main(String[] args) throws Exception {
        TestFrame2.main(null);
    }*/

    public MyTestPanel() {
        //setPreferredSize(new Dimension(700, 300));
        this.setFocusable(true);
        this.setBackground(Color.WHITE);

        addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {
                char ch = e.getKeyChar();
                if (isPrintableChar(ch)) {
                    lastLine.append(ch);
                    repaint();
                } else if (ch == '\b') {
                    if (lastLine.length() > 0) {
                        lastLine.deleteCharAt(lastLine.length() - 1);
                        repaint();
                    }
                } else if (ch == '\n') {
                    lines.add(lastLine.toString());
                    lastLine.delete(0, lastLine.length());
                    repaintAndUpdate();
                }
                updateScrollbar();
                System.out.println("textContent " + lastLine);
            }

            @Override
            public void keyReleased(KeyEvent e) {

            }

            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_BACK_SPACE) {
                    System.out.println("BackSpace pressed");
                }
            }
        });
    }

    public void updateScrollbar() {
        if (parentPane != null) {
            JScrollBar vertical = parentPane.getVerticalScrollBar();
            System.out.println(vertical.getMaximum() + " : " + parentPane.getHeight() + " : " + (vertical.getMaximum() - parentPane.getHeight()) + " : " + vertical.getHeight());
            vertical.setValue(vertical.getMaximum() - parentPane.getHeight() + parentPane.getHorizontalScrollBar().getHeight());
        }
    }
    private void repaintAndUpdate() {
        int linesHeight = START_Y + lines.size() * LINE_HEIGHT + LINE_HEIGHT;//+LINE_HEIGHT just trial and error
        if(linesHeight > parentPane.getHeight()) {
            System.out.println(getHeight() + " : " + (getHeight() + LINE_HEIGHT));
            super.setPreferredSize(new Dimension(getWidth(), getHeight() + LINE_HEIGHT) );
            parentPane.updateUI();
            super.revalidate();
            System.out.println(getHeight());

            repaint();
        }
    }

    private boolean isPrintableChar(char ch) {
        boolean result = false;
        if (validCharacters.indexOf(ch) != -1) {
            result = true;
        }
        return result;
    }

    /*public void startCursorThread() {
        final Graphics g = this.getGraphics();
        final int blinkInterval = 500;//miliseconds
        final int cursorWidth = 5;
        final int cursorHeight = LINE_HEIGHT;

        cursorThread = new Thread () {
            public void run () {
                boolean showCursor = true;
                while(keepRunningCursor.get()) {
                    localSleep(blinkInterval);
                    int x = START_X + g.getFontMetrics().stringWidth(lastLine.toString());
                    //int y = START_Y + lines.size() * LINE_HEIGHT - LINE_HEIGHT + LINE_HEIGHT/3;
                    int y = lastLineY - (int)(2/3.0 * LINE_HEIGHT);
                    if(showCursor) {
                        g.fillRect(x, y, cursorWidth, cursorHeight);
                        g.drawRect(x - 50, y - 50, 100, 100);
                    } else {
                        g.setColor(Color.WHITE);
                        g.fillRect(x, y, cursorWidth, cursorHeight);
                        g.drawRect(x - 50, y - 50, 100, 100);
                        g.setColor(Color.BLACK);
                    }
                    showCursor = !showCursor;

                    System.out.printf("%d %d %d %d\n", x, y, cursorWidth, cursorHeight);
                    //MyTestPanel.this.repaint(x, y, cursorWidth, cursorHeight);
                }

            }

            public void localSleep(long sleepTime) {
                try {
                    sleep(sleepTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        };

        cursorThread.start(); 
    }*/

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        int y = START_Y;
        for (int i = 0; i < lines.size(); i++, y += LINE_HEIGHT) {
            g.drawString(lines.get(i), START_X, y);
        }
        if (lastLine.length() > 0) {
            g.drawString(lastLine.toString(), START_X, y);
        }
        int x = START_X + g.getFontMetrics().stringWidth(lastLine.toString());
        //cursor
        g.fillRect(x + 2, y - (int)(2/3.0 * LINE_HEIGHT), 5, 20);
        //lastLineY = y;
    }

    public void setParentPane(JScrollPane parentPane) {
        this.parentPane = parentPane;
        setPreferredSize(new Dimension(parentPane.getWidth(), parentPane.getHeight()));
    }

    /*public void stopCursorThread() {
        this.keepRunningCursor.set(false);
        System.out.println("Stopped cursor thread");
    }*/
}

输出截图