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
。所以...
- 我输入
reset halt
.
- 我按
Backspace
2 次。
- 我的 JTextArea 上的结果是
reset halt[K[K
。
- 实际控制模块的结果(我看不到结果)是
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)
}
当然我错了,问题依然存在。
所以我的问题是:
- 是否可以通过阅读连载"update" 我的
JTextArea
中的内容 "Backspaced"?
- 如何防止讨厌的
[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");
}*/
}
输出截图
我的目标有点复杂,我不确定它是否可行。但是我正在为我工作的公司制作终端程序。
所以程序是这样构建的(至少,重要的部分)。
我有一个 JTextArea
正在接收使用 JSSC
库从串行读取的字节。这个 JTextArea
有一个按键侦听器,它侦听按键并使用 SerialPort.writeInt(event.getKeyCode());
或 .getKeyChar();
将每个按键作为 int 发送到串行,我不记得了,但我认为它是 getKeyChar();
。当我在 JTextArea 上按 Backspace
时,假设我输入了 reset halt
以将控制模块重置为出厂默认设置并停止它。如果我按 Backspace
2 次,在实际的控制模块中,它会执行 "Backspace" 2 个字符,但在 JTextArea 上它仍会显示 reset halt
PLUS(我主要想修复的部分)[K
每次我按 Backspace
。所以...
- 我输入
reset halt
. - 我按
Backspace
2 次。 - 我的 JTextArea 上的结果是
reset halt[K[K
。 - 实际控制模块的结果(我看不到结果)是
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)
}
当然我错了,问题依然存在。
所以我的问题是:
- 是否可以通过阅读连载"update" 我的
JTextArea
中的内容 "Backspaced"? - 如何防止讨厌的
[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");
}*/
}
输出截图