- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的目标有点复杂,我不确定它是否可能。但我正在为我工作的公司制作一个终端程序。
所以程序是这样构建的(至少是重要的部分)。我有一个 JTextArea ,它正在使用 JSSC 库接收从串行读取的字节。这个 JTextArea 有一个按键监听器,用于监听按键并使用 SerialPort.writeInt(event.getKeyCode());
或 将每个按键作为 int 发送到串行。 >.getKeyChar();
我不记得了,但我认为是 getKeyChar();
。当我在 JTextArea 上按 Backspace
时,假设我输入 resethalt
将控制模块重置为出厂默认值并停止它。如果我按 Backspace
2 次,在实际的控制模块中,它会执行“Backspace”2 个字符,但在 JTextArea 上它仍然会显示 resethalt
PLUS(我想要的部分主要修复)每次按 Backspace
时[K
。所以...
重置暂停
。Backspace
两次。重置暂停[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)
}
当然我错了,问题仍然存在。
所以我的问题是:
JTextArea
的内容?[K
出现在我的控制台 (JTextArea
) 上。我不需要你为我做这些工作,只是把我推向正确的方向。
对于没有在这个问题上放置太多代码,我深表歉意。由于“安全原因”,我在家,工作场所没有互联网(令人震惊)。如果您需要更多代码,请告诉我,如果可以的话我会尝试添加它!
我还有一个关于我想在控制台中添加/更改的内容的附带问题 (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");
}*/
}
输出截图
关于Java:向串行发送和接收 KeyEvent.VK_BACK_SPACE 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34522486/
我正在使用 voip 推送通知制作 ios 应用程序。 我想从 Node js 发送 voip 推送通知,但不是很好。 我阅读了本教程 CallKit iOS Swift Tutorial for V
我编写了一个服务器,当浏览器尝试连接到某些站点时,它会检查黑名单并发回 404,但是当我调用 send() 时没有错误,但消息不会出现在网络上浏览器,除非我关闭连接? 有什么建议吗? 接受来自浏览器的
#include int main() { char c = getchar(); //EOF (ctrl + d ) while( ( c = getchar() ) != '?'
我正在尝试使用MailMessage对象通过PowerShell发送电子邮件。该脚本使用Import-CSV来使用文件,然后在电子邮件正文中使用ConvertTo-HTML。由于我要发送的电子邮件客户
我需要创建一个脚本,每 30 秒对网络流量进行一次采样并存储发送/接收的字节。该数据随后用于绘制图形。我编写了一个在 Windows 2012 上完美运行的程序,但我意识到某些 cmdlet 在以前的
我正在运行“autoit3.chm”文件。当它运行时,我想发送一个向下键箭头,但它不起作用: $file = FileGetShortName("C:\Users\PHSD100-SIC\Deskto
当我使用网络浏览器测试我的程序时,我可以很好地写入套接字/FD,所以我决定循环它并在连接中途切断连接,我发现了一个问题。 send() 能够在套接字不可用时关闭整个程序。我认为问题在于该程序陷入了第
我正在运行“autoit3.chm”文件。当它运行时,我想发送一个向下键箭头,但它不起作用: $file = FileGetShortName("C:\Users\PHSD100-SIC\Deskto
所以我试图向自己发送数据并接收数据然后打印它,现在我已经测试了一段时间,我注意到它没有发送任何东西,事实上,也许它是,但我没有正确接收它,我需要这方面的帮助。 这就是我用来发送数据的
问题:开发人员创建自己的序列化格式有多常见?具体来说,我使用 java 本质上将对象作为一个巨大的字符串发送,并用标记来分隔变量。 我的逻辑:我选择这个是因为它几乎消除了语言依赖性(忽略java的修改
我必须在 Linux 上编写一个应用程序,该应用程序需要与具有自定义以太网类型的设备进行通信。甚至在如何编写这样的应用程序中也有很多解决方案。一个缺点是需要 root 访问权限(AFAIK)。之后释放
我有一个包含三个单选按钮选项的表单。我需要将表单数据提交到另一个文件,但由于某种原因,发送的数据包含所选单选按钮的值“on”,而不是 value 属性的值。 我尝试通过 post() 函数手动操作和发
基本上我想实现这样的目标: Process 1 Thread 1 Receive X from process 2 Thread 2 Receive Y from proces
我目前正在 Google App Engine 上开发一个系统,对它还很陌生,我正在使用 Java 平台进行开发。我在 servlet 之间发送 session 对象时遇到问题。我已经在 appeng
当我尝试将“this”(触发的元素)作为参数发送给函数时,函数收到“Object[Document build.php]”作为参数,而不是触发的元素。请让我知道我的错误: function set(a
我正在寻找让我的应用响应联系人 > 发送的魔法咒语。我希望能够接收联系人的 URI 以便检索联系人。谁有 list 过滤器/代码 fragment 吗? 最佳答案 我没有睾丸,但您可以尝试基于 ACT
关于我心爱的套接字的另一个问题。我先解释一下我的情况。之后我会告诉你是什么困扰着我。 我有一个客户端和一个服务器。这两个应用程序都是用 C++ 编写的,实现了 winsock2。连接通过 TCP 和
我看到了这篇文章 http://www.eskimo.com/~scs/cclass/int/sx5.html 但这部分让我感到困惑:如果我们已经使用 send_array 或 send_array_
我对这行代码有疑问。我必须将一个数据包带到一个端口并重新发送到接口(interface)(例如:eth0)。我的程序成功地从端口获取数据包,但是当我重新发送(使用 send())到接口(interfa
我正在尝试编写一个 X11 输入驱动程序,它可以使用我的 Android 手机上的触摸屏来移动和单击鼠标。我可以正常移动鼠标,但我无法让应用程序正确识别点击。我当前的代码位于 https://gist
我是一名优秀的程序员,十分优秀!