- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 Ctrl-F6 在 JTable 和关联的 JTree 之间切换。然而,Ctrl-F6 会启动 JTable 的单元格编辑器。 JTable 只有一个默认的键监听器: javax.swing.ToolTipManager$AccessibilityKeyListener... 但删除它并不能解决问题。所以我试图找出这是否是一个键绑定(bind)以及它可能驻留在哪里...所以我编写了这个简单的函数(在 Jython 中,但对于 Java 主义者来说应该完全可以理解):
def print_comp_maps( comp, name ):
# list all task tree's system-set hotkeys
# NB respective values here: 0, 1, 2
input_map_conditions = [ JComponent.WHEN_FOCUSED, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, JComponent.WHEN_IN_FOCUSED_WINDOW ]
input_map_names = [ "focused", "ancestor", "in focused window" ]
print( "=== comp: %s" % name )
for condition in input_map_conditions:
print( " === condition: %s" % input_map_names[ condition ])
i_map = comp.getInputMap( condition )
depth = 0
while i_map:
depth += 1
print( " %s=== imap %s:" % ( " " * depth, i_map ))
keys = i_map.keys()
if keys:
for keystroke in keys:
print( " %s=== keystroke %s value %s" % ( " " * ( depth + 1 ), keystroke, i_map.get( keystroke ) ) )
i_map = i_map.parent
JTable 的结果是:
=== comp: date_table
=== condition: focused
=== imap javax.swing.InputMap@1a8a84f:
=== condition: ancestor
=== imap javax.swing.InputMap@1c1edd9:
=== imap javax.swing.plaf.InputMapUIResource@e674b9:
=== keystroke ctrl pressed DOWN value selectNextRowChangeLead
=== keystroke shift pressed UP value selectPreviousRowExtendSelection
=== keystroke shift pressed INSERT value paste
=== keystroke ctrl pressed RIGHT value selectNextColumnChangeLead
=== keystroke shift ctrl pressed LEFT value selectPreviousColumnExtendSe
lection
=== keystroke shift pressed KP_UP value selectPreviousRowExtendSelection
=== keystroke pressed DOWN value selectNextRow
=== keystroke ctrl pressed UP value selectPreviousRowChangeLead
=== keystroke ctrl pressed LEFT value selectPreviousColumnChangeLead
=== keystroke pressed CUT value cut
=== keystroke pressed END value selectLastColumn
=== keystroke shift pressed PAGE_UP value scrollUpExtendSelection
=== keystroke pressed KP_UP value selectPreviousRow
=== keystroke shift ctrl pressed UP value selectPreviousRowExtendSelecti
on
=== keystroke ctrl pressed HOME value selectFirstRow
=== keystroke ctrl pressed INSERT value copy
=== keystroke shift pressed LEFT value selectPreviousColumnExtendSelecti
on
=== keystroke ctrl pressed END value selectLastRow
=== keystroke ctrl pressed PAGE_DOWN value scrollRightChangeSelection
=== keystroke shift ctrl pressed RIGHT value selectNextColumnExtendSelec
tion
=== keystroke pressed LEFT value selectPreviousColumn
=== keystroke ctrl pressed PAGE_UP value scrollLeftChangeSelection
=== keystroke pressed KP_LEFT value selectPreviousColumn
=== keystroke shift pressed KP_RIGHT value selectNextColumnExtendSelecti
on
=== keystroke pressed SPACE value addToSelection
=== keystroke ctrl pressed SPACE value toggleAndAnchor
=== keystroke shift pressed SPACE value extendTo
=== keystroke shift ctrl pressed SPACE value moveSelectionTo
=== keystroke shift ctrl pressed DOWN value selectNextRowExtendSelection
=== keystroke ctrl pressed BACK_SLASH value clearSelection
=== keystroke pressed ESCAPE value cancel
=== keystroke shift pressed DELETE value cut
=== keystroke shift pressed HOME value selectFirstColumnExtendSelection
=== keystroke pressed ENTER value selectNextRowCell
=== keystroke shift pressed ENTER value selectPreviousRowCell
=== keystroke pressed F8 value focusHeader
=== keystroke pressed RIGHT value selectNextColumn
=== keystroke shift ctrl pressed PAGE_UP value scrollLeftExtendSelection
=== keystroke shift pressed DOWN value selectNextRowExtendSelection
=== keystroke shift ctrl pressed KP_UP value selectPreviousRowExtendSele
ction
=== keystroke pressed PAGE_DOWN value scrollDownChangeSelection
=== keystroke shift pressed KP_LEFT value selectPreviousColumnExtendSele
ction
=== keystroke ctrl pressed X value cut
=== keystroke shift ctrl pressed PAGE_DOWN value scrollRightExtendSelect
ion
=== keystroke ctrl pressed SLASH value selectAll
=== keystroke ctrl pressed C value copy
=== keystroke ctrl pressed KP_RIGHT value selectNextColumnChangeLead
=== keystroke shift pressed END value selectLastColumnExtendSelection
=== keystroke shift ctrl pressed KP_DOWN value selectNextRowExtendSelect
ion
=== keystroke shift pressed TAB value selectPreviousColumnCell
=== keystroke ctrl pressed KP_LEFT value selectPreviousColumnChangeLead
=== keystroke pressed HOME value selectFirstColumn
=== keystroke ctrl pressed V value paste
=== keystroke pressed KP_DOWN value selectNextRow
=== keystroke ctrl pressed KP_DOWN value selectNextRowChangeLead
=== keystroke shift pressed RIGHT value selectNextColumnExtendSelection
=== keystroke ctrl pressed A value selectAll
=== keystroke shift ctrl pressed END value selectLastRowExtendSelection
=== keystroke pressed COPY value copy
=== keystroke ctrl pressed KP_UP value selectPreviousRowChangeLead
=== keystroke shift ctrl pressed KP_LEFT value selectPreviousColumnExten
dSelection
=== keystroke shift pressed KP_DOWN value selectNextRowExtendSelection
=== keystroke pressed TAB value selectNextColumnCell
=== keystroke pressed UP value selectPreviousRow
=== keystroke shift ctrl pressed HOME value selectFirstRowExtendSelectio
n
=== keystroke shift pressed PAGE_DOWN value scrollDownExtendSelection
=== keystroke pressed KP_RIGHT value selectNextColumn
=== keystroke shift ctrl pressed KP_RIGHT value selectNextColumnExtendSe
lection
=== keystroke pressed F2 value startEditing
=== keystroke pressed PAGE_UP value scrollUpChangeSelection
=== keystroke pressed PASTE value paste
=== condition: in focused window
=== imap javax.swing.ComponentInputMap@fa5f28:
...没有任何 F6 或 Ctrl-F6 键绑定(bind)的迹象...有人知道发生了什么吗?
稍后
顺便说一下,完全可以将 Ctrl-F6 绑定(bind)添加到(例如)JTable 的“WHEN ANCESTOR OF ...”InputMap(例如,第一代,即 javax.swing.InputMap@1c1edd9 中)上面列出)。然后在其中的对象和 ActionMap 中的操作之间添加绑定(bind)。然后按 Ctrl-F6 触发该操作。但是,正如人们可能期望的那样,这决不会抑制“startEditing”操作。谜中之谜是:这个绑定(bind)的ferkin位于哪里???我探索了 JScrollPane(没有喜悦,没有惊喜),甚至提交给 DefaultCellEditor 构造函数的 JTextField 对象...(没有喜悦,更没有惊喜)。难住了。有人认识绑定(bind) super 极客吗?
甚至更晚
虽然 Yarik 已经解决了主要问题,但我仍然有一个问题:当实现表格并以编程方式将焦点放在先前选择的行上(即不使用鼠标)时,F2 最初不起作用...它是只有在您导航(例如使用向上/向下键)后,您才会发现 F2 开始编辑。 SSCCE 说明问题:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.lang.Runnable;
import javax.swing.*;
public class TableCellEditProb {
public static void main(String args[]) {
Runnable show_frame = new Runnable(){
public void run(){
JFrame main_frame = new JFrame( "F2 no effect on first realisation!");
main_frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
final JTable table = new JTable( 5, 2 );
table.setPreferredSize( new Dimension( 400, 200 ));
table.setRowSelectionInterval( 2, 2 );
table.putClientProperty("JTable.autoStartsEdit", false );
JPanel panel = new JPanel( new BorderLayout());
AbstractAction button_action = new AbstractAction(){
public void actionPerformed(ActionEvent e){
System.out.println( "button pressed");
table.requestFocus();
}
};
button_action.putValue( AbstractAction.NAME, "Click (or press spacebar) to change focus to table..." );
JButton button = new JButton( button_action );
panel.add( table, BorderLayout.WEST );
panel.add( button, BorderLayout.EAST );
main_frame.getContentPane().add( panel );
main_frame.pack();
button.requestFocus();
main_frame.setVisible( true );
}
};
java.awt.EventQueue.invokeLater( show_frame );
}
}
最佳答案
默认操作<->键由InputMap和ActionMap中的L&F定义我相信他们是在任何外部听众之前被调用的。您随时可以覆盖它。
或者,您可以覆盖processKeyBinding
这是一个可以满足您需要的代码示例。它拦截 Cntrl-F6 并打印到 sysout。
请参阅我关于为什么 Cntrl-F6 不在绑定(bind)中的评论。
公共(public)类PrintTableTest {
public JPanel buildUI() {
String[] columnNames = {"First Name",
"Last Name",
"Sport",
"# of Years",
"Vegetarian"};
Object[][] data = {
{"Mary", "Campione",
"Snowboarding", 5, new JComboBox(new Object[]{Boolean.TRUE, Boolean.FALSE})},
{"Alison", "Huml",
"Rowing", 3, Boolean.FALSE},
{"Kathy", "Walrath",
"Knitting", 2, Boolean.FALSE},
{"Sharon", "Zakhour",
"Speed reading", 20, Boolean.TRUE},
{"Philip", "Milne",
"Pool", 10, Boolean.TRUE
}
};
final JTable table = new JTable(increase(data, 50), columnNames);
JScrollPane scrollPane = new JScrollPane(table);
JButton print = new JButton("Print");
print.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
table.print();
} catch (PrinterException e1) {
e1.printStackTrace();
}
}
});
table.setDefaultRenderer(TableColumn.class, new TableCellRenderer());
JPanel panel = new JPanel(new BorderLayout(5, 5));
panel.add(scrollPane, BorderLayout.CENTER);
panel.add(print, BorderLayout.SOUTH);
JTextField textField = new JFormattedTextField();
JSpinner spinner = new JSpinner(new SpinnerNumberModel());
spinner.setEditor(textField);
textField.setEditable(false);
panel.add(spinner, BorderLayout.NORTH);
panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F6, InputEvent.CTRL_DOWN_MASK), "doSomething" );
panel.getActionMap().put("doSomething",new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("TEST OUT");
}
});
table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);
return panel;
}
private Object[][] increase(Object[][] src, int times) {
Object[][] out = new Object[src.length * times][];
for (int i = 0; i < times; i++) {
System.arraycopy(src, 0, out, i * src.length, src.length);
}
return out;
}
public JFrame getFrame(String name) {
JFrame frame = new JFrame(name);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setContentPane(buildUI());
frame.setSize(200, 200);
frame.pack();
return frame;
}
public static void main
(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
PrintTableTest ui = new PrintTableTest();
JFrame frame = ui.getFrame("TABLE PRINT TEST");
frame.setVisible(true);
}
});
}
private class TableCellRenderer extends DefaultTableCellRenderer {
/**
* Returns the default table cell renderer.
*
* @param table the <code>JTable</code>
* @param value the value to assign to the cell at <code>[row, column]</code>
* @param isSelected true if cell is selected
* @param hasFocus true if cell has focus
* @param row the row of the cell to render
* @param column the column of the cell to render
* @return the default table cell renderer
*/
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
if (value instanceof JComboBox) {
return (Component) value;
}
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
}
关于java - 为什么 F6(或 Ctrl-F6)开始编辑 JTable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23372092/
我已经多次看到我的问题被问到,但我从未看到我期望的答案。我已经在 JTable 中输入了数据库的元素,并且我希望能够通过一些 JButtons 删除/添加元素。问题是当我添加/删除时,修改在数据库
我正在使用 JTable 做一个项目,我想让我的表格单元格可编辑。我用过, public boolean isCellEditable(int row, int column) {
我正在编写一个应用程序包,其中包含一个主类,其中主方法与GUI类分开,GUI类包含一个带有jtabbedpane的jframe,它有两个选项卡,第一个选项卡包含一个jtable,称为jtable1,第
我制作了一个表格来将 Arraylist 中的数据加粗,但如果我删除该数据,我会希望该表格更新并取消对 Arraylist 中加粗的单元格的粗体显示。我该怎么做呢?或从另一个类关闭该类的实例 最佳答案
如果我的 JTable 的列未按字母顺序排列,我可以使用 getSelectedRows() 并毫无问题地获取它们的行的值。但是,如果用户单击列名并且行在该列中按字母顺序排列,则 getSelecte
我有一个 JTable,用户可以在其中在单元格中输入数据。然后有一个“保存”按钮,用于收集表格数据,将其格式化为 csv,并将其保存到文件中。 但是,如果用户将最后编辑的单元格保留在选定状态,并单击“
我编写了下面的代码,以便在当前 JTable 上进行选择时创建一个新的 JTable: makeTbale.addActionListener(new ActionListener() { pub
我正在使用 Swing 编写 Java 应用程序。我有两个表,我必须将内容从一个表复制到另一个表(复制)。问题是,如果我清除目标表行,那么我的源表行也会被删除。 如果我按 CopyAll,那么我会将
我一直致力于JTable,我的项目: 从数据库读取数据(我完成了这个任务并能够在JTable中显示)。 然后将数据按子组显示并保存到文件(文本/Excel)中。 我有 JTable 的基本知识,并且使
我有以下类(class): public class customer_master extends javax.swing.JInternalFrame { Connection con =
您好,我是 JAVA 的新手,在学习时正在开发 GUI。我创建了一个带有 ScrollPane 和 JTable 的 JFrame。当我增加 2 列以上时,第一行下方的数据不会显示。 此外,当我的 J
我正在进行项目的最后一部分,这是我遇到的最后问题之一。这部分用于编辑预订,即更改为特定预订预订的房间。我有 2 个 JTable,其中一个有可用房间,另一个有已预订的房间。两者都有单独的 Defaul
我有 2 个 JTable,我需要从表 2 中复制特定列(包括该列中的所有数据)并将其添加到表 1 中的下一个空闲列中。有人知道执行此操作的最佳方法吗? 谢谢 最佳答案 DefaultTableMod
美好的一天!我在 Jtable 方面遇到了困难。我已经阅读和浏览了各种教程,但我不太明白它的要点。我的问题是,我必须从 jtable (jTable1) 中选择包含 (ClientID、LastNam
我的 SERVER 表单上有一个 JTable,它是从 MySQL 数据库填充的,在构造函数中编码: String sql = "SELECT * from fiekorari"; t
我在我的项目上工作,我需要将一行从 JTable 复制到另一个 JTable,第二个 JTable 应该只是单行表。我为第一个 JTable 创建了 mouselistener,双击它应该复制行并将其
我有这段代码可以完全按预期工作 package com.grantbroadwater.signInAssistant.view; import java.awt.BorderLayout; impo
我有一个列表人员(在 jTable 中)并想将其导出到 excel 文件我需要每个人转到单独的工作表所以我需要拆分原始 jTable,但我不知道如何? 这就是我想做的? public void exp
我有一个包含 7 列和 2 行的 JTable。在我的 JTable 下方,我有一个 JTextField。当我在 JTextField 中输入内容时,我可以很容易地得到我输入的内容:String l
我正在尝试将一个 JTable 嵌套在另一个 JTable 的列中(使用 CellRenderer)。 示例(错误)输出: 为什么下面的例子没有输出表中表? import java.awt.Compo
我是一名优秀的程序员,十分优秀!