- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将箭头键绑定(bind)到整个窗口的某些特定操作(无论聚焦哪个组件)。特别是我想用箭头键移动 JList 中的选择栏。我的窗口包含一个 JTextArea 和不同的 JScrollPanes。
我猜想会发生以下问题:当我更改列表选择时,文本区域获得焦点(这属于我想要实现的逻辑)。当 JTextArea 或 JScrollPane 获得焦点时,所有向上箭头等按键事件都会“丢失”(或者更确切地说,仅影响 TextComponent/Pane)。
这是一个演示该问题的小示例:
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class KeyProblemExample extends JFrame implements ListSelectionListener {
private JList<Integer> list;
private JTextArea textArea;
private JLabel label;
public KeyProblemExample()
{
Font font = new Font("Dialog", Font.PLAIN, 20);
Integer[] listValues = {1, 2, 3};
list = new JList<>(listValues);
list.setFixedCellWidth(50);
list.setFont(font);
textArea = new JTextArea();
textArea.setEditable(false);
textArea.setLineWrap(true);
String text = Stream.generate(()-> "xyz").limit(300).collect(Collectors.joining());
textArea.setText(text);
textArea.setFont(font);
label = new JLabel("bla bla bla");
label.setFont(font);
}
private void buildLogic()
{
//list selection listener
list.addListSelectionListener(this);
//up and down keys
AbstractAction down = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if (list.getSelectedIndex() >= 0 && list.getSelectedIndex() < list.getModel().getSize() - 1)
list.setSelectedIndex(list.getSelectedIndex() + 1);
}
};
AbstractAction up = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if (list.getSelectedIndex() >= 1 && list.getSelectedIndex() < list.getModel().getSize())
list.setSelectedIndex(list.getSelectedIndex() - 1);
}
};
KeyStroke keyDown = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, KeyEvent.ALT_MASK);
label.getActionMap().put("indexDown", down);
label.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyDown, "indexDown");
KeyStroke keyUp = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0);
label.getActionMap().put("indexUp", up);
label.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyUp, "indexUp");
}
private void displayGUI()
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new BorderLayout());
JScrollPane sp1 = new JScrollPane();
sp1.setViewportView(textArea);
sp1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
sp1.setWheelScrollingEnabled(true);
JScrollPane sp2 = new JScrollPane();
sp2.setViewportView(list);
sp2.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
sp2.setWheelScrollingEnabled(true);
panel.add(sp1, BorderLayout.CENTER);
panel.add(sp2, BorderLayout.EAST);
panel.add(label, BorderLayout.SOUTH);
this.getContentPane().add(panel);
this.pack();
this.setSize(400,400);
this.setLocationByPlatform(true);
this.setVisible(true);
}
@Override
public void valueChanged(ListSelectionEvent e) {
textArea.requestFocus();
// label.requestFocus();
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
KeyProblemExample x = new KeyProblemExample();
x.buildLogic();
x.displayGUI();
}
};
SwingUtilities.invokeLater(r);
}
}
在此示例中,Alt-ArrowDown 命令有效,而普通的 ArrowUp 命令无效。如果我更改 requestFocus()
行,以便标签请求焦点,ArrowUp 也可以工作(因为现在是标签而不是文本区域获得焦点)。
我的问题:我可以做什么来将箭头键等“窗口范围”的键绑定(bind)到特定操作(特别是如果我的窗口中有文本组件)。
最佳答案
文本组件的键绑定(bind)在获得焦点时优先。因此,您需要使用如下代码从文本组件中删除绑定(bind):
textComponent.getInputMap().put(KeyStroke.getKeyStroke("UP"), "none");
请参阅 Swing 教程中 How to Make/Remove Bindings 的部分了解更多信息。
关于java - Swing - 使用 TextComponents 的 GUI 中的关键问题(箭头键、Tab 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33884770/
我已经运行 nagios 大约两年了,但最近这个问题开始出现在我的一项服务中。 我越来越 CRITICAL - Socket timeout after 10 seconds 对于 check_htt
我用 CSS 做到了这一点: 但我希望我的客户更改图像框架。在我的图像中,当前帧只是一种颜色 (#000)。但框架可以是装饰性的。因此,客户应使用装饰图像进行取景。我看过 W3Schools' bor
我编写了一个脚本来检查对象中是否有任何缺失的字段,然后返回具有缺失字段的项目的 ID。 它正在返回: [ '222', '333' ] 我期望返回: ['333'] 为什么它也返回222 id? fu
我正在读 Ramakrishnan 的书数据库管理系统,在模式细化和范式相关的章节中,我看到一句话说: K is a candidate key for R means that K ----> R
我正在编写一个 Java 应用程序,以在一夜之间自动化在线游戏中的角色 Action (特别是,它在《最终幻想 XI》中捕鱼)。该应用程序大量使用 java 的 Robot 类来模拟用户键盘输入和检测
我有这个 react 代码,我在某些输入组件上使用 new Date().getTime() 作为 react 键 Prop 。这可能是一种反模式,因为键需要稳定。但我想了解为什么这如此有问题。为什么
我正在尝试将我的简单查询优化为更复杂的查询。 我有三个表 Table 1 a_id info 1 talk 2 talk 3 sleep 4 sit Table 2
Google PageSpeed 审核建议将首屏内容的关键 CSS 添加到 中的标签,并将其余部分推迟到内容加载完成之后。 虽然我不同意这种做法,但正确的实现方式是什么? 我对使用它有一些保留意见
我已经使用 Pika 将 Websocket 集成到 Tornado 和 RabbitMQ 中。它成功地在各种队列上运行直到一段时间。然后引发以下错误: 严重:pika.connection:关闭时尝
我在本地使用 Gulp 和 SASS 进行开发,为动态站点(即 CMS 驱动)编译 CSS。我正在尝试配置一个解决方案来编译全局与关键路径 CSS。到目前为止最好的想法是将我的主要 scss 文件拆分
关于为 gtkmm 运行以下 simple.cc 示例 #include int main(int argc, char * argv[]){ Glib::RefPtr app = Gt
我正在生成一个 TSX 元素列表: this.productsModel = this.state.products.map(o => ( 但是,react 警告我:
我正在使用 Addy Osmani 的“Critical” https://github.com/addyosmani/critical 下面的 package.json 工作正常,但构建仅复制关键
我有一个 Multimap multimap = ArrayListMultimap.create(); 来自 Guava 。我想知道如何对多图中的 Date 键进行排序。 目前,我正在这样做:
我有一个基于 Jekyll 的网站,我想尽快完成它。我的目标是构建 Jekyll 站点、生成关键 CSS 并缩小 HTML 的 gulp 任务。 我的 gulpfile 的一部分看起来像这样: gul
考虑以下串行函数。当我并行化我的代码时,每个线程都会从并行区域(未显示)内调用此函数。我正在努力使这个线程安全和高效(快速)。 float get_stored_value__or__calculat
我正尝试在 tensorflow 中为我自己的自定义类别重新训练 Inception v3 模型。我已经下载了一些数据并将其格式化为目录。当我运行时,python 脚本为图像创建了瓶颈,然后当它运行时
我该如何追查此错误消息的根本原因? (test:1090): GStreamer-CRITICAL **: gst_debug_log_valist: assertion `category != N
我想为要托管在 Pivotal CloudFoundry 上的 Spring Boot 应用程序强制执行 HTTPS,我想现在大多数应用程序都需要这样做。据我所知,常用的方法是使用 http.requ
在 Travis CI 上运行 Pytest 时,我收到 Key -Error。请在下面找到我的程序: import sys import os sys.path.append(os.path.dir
我是一名优秀的程序员,十分优秀!