Java:从串行

时间:2015-12-30 03:21:54

标签: java serial-port keyevent

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

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

  1. 我输入Backspace
  2. 我按reset halt 2次。
  3. 我的JTextArea的结果是Backspace
  4. 实际控制模块(我看不到结果)的结果应该是reset halt[K[K
  5. 我认为这可能是我正在使用的密码,所以当我按reset ha时,我发了一个if语句来改变串口发送的内容。

    Backspace

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

    所以我的问题是:

    1. 是否可以通过阅读序列来“更新”我的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) } 的“退格”内容?
    2. 如何防止讨厌的JTextArea出现在我的控制台上([K)。
    3. 我不需要你为我做这项工作,只是为了让我朝着正确的方向前进。

      我很抱歉没有把我的大部分代码放在这个问题上。我在家里,我工作的工作区因“安全原因”没有互联网(震撼)。如果您需要更多代码,请告诉我,如果可以,我会尝试添加代码!

      我还有一个关于我想要在我的控制台中添加/更改的内容的问题(JTextArea)。我不知道它的技术术语,但我想增加我的控制台上的键入光标的宽度,使其更明显,而不是鼠标光标,但是当您单击文本字段时显示的闪烁光标。那个光标叫什么?

1 个答案:

答案 0 :(得分:1)

以下是一个例子。

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

此面板也会检测到KeyEvents。由于这没有任何默认行为,您可以通过给定的输入自由地执行您想要的操作。

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

<强> TestFrame2

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");
    }*/
}

输出截图

enter image description here