gpt4 book ai didi

java - 为什么 F6(或 Ctrl-F6)开始编辑 JTable?

转载 作者:行者123 更新时间:2023-11-30 03:55:18 25 4
gpt4 key购买 nike

我想使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com