我有一个可编辑的JTable,并设置了一个DefaultCellEditor,如下所示:
colModel.getColumn( 1 ).setCellEditor( new DefaultCellEditor( txtEditBox ) {
// ...
@Override
public void cancelCellEditing() {
super.cancelCellEditing();
// handling the event
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
但是,在编辑此列中的单元格时按下escape时,虽然编辑模式已完成,但不会调用此方法.有什么想法吗?难道我做错了什么?有没有办法处理这个(除了手动添加KeyListener)?
我需要在jTable中显示精确的2位小数.为此,我创建了一个自定义单元格编辑器:
public class NumberCellEditor extends DefaultCellEditor {
public NumberCellEditor(){
super(new JFormattedTextField());
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
JFormattedTextField editor = (JFormattedTextField) super.getTableCellEditorComponent(table, value, isSelected, row, column);
if (value!=null){
DecimalFormat numberFormat = new DecimalFormat("#,##0.00;(#,##0.00)");
editor.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(numberFormat)));
Number num = (Number) value;
String text = numberFormat.format(num);
editor.setHorizontalAlignment(SwingConstants.RIGHT);
editor.setText(text);
}
return editor;
}
}
Run Code Online (Sandbox Code Playgroud)
此单元格编辑器适用于英语区域设置,其中点用作小数点.但在德语语言环境中,它不接受逗号作为小数点的值.如果我的代码存在问题,请告诉我.提前致谢.
编辑:这是我如何工作:
public class NumberCellEditor extends DefaultCellEditor {
public NumberCellEditor(){
super(new JFormattedTextField());
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, …Run Code Online (Sandbox Code Playgroud) 我在表格单元格中使用了TableCellRenderer多个自定义JFormattedTextField.我使用相同的组件TableCellEditor.现在我需要知道JFormattedTextField用户点击了什么,以及该字段中的位置(可以完成viewToModel).
使用自定义时TableCellEditor,Point从鼠标单击获取的唯一方法是使用自定义isCellEditable(EventObject e)方法CellEditor.在Point给出的父母坐标系统相同.
anEvent在调用组件坐标系中.
但是如何在点击的坐标上获得组件?我试过findComponentAt(Point p)但它会回来null给我.
这是我测试过的一些代码:
@Override
public boolean isCellEditable(EventObject e) {
if(e instanceof MouseEvent) {
MouseEvent ev = (MouseEvent)e;
Point p = ev.getPoint();
// gives strange values
Point p3 = editor.getLocation();
// x: 0 y: 0
Point tp = ((JTable)e.getSource()).getLocation();
// these returns null
Component c1 = renderer.findComponentAt(p);
Component c2 = editor.findComponentAt(p);
System.out.println("Click at …Run Code Online (Sandbox Code Playgroud) 我有一个JTable,其中包含一个包含JComboBox的列.
我有一个附加到JComboBox的ItemListener,它对任何更改起作用.
但是,ItemListener没有获取已更改的ComboBox所在的Row的方法.
我需要行号以便在ComboBox发生更改时对同一行中的另一列进行操作.
任何帮助,将不胜感激.
这是我的简短代码.我想要完成的是在itemlistener获取更改时获取ComboBox的表行.
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.IOException;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
public class Example extends JFrame {
private static final long serialVersionUID = 1L;
public static int maxX, maxY;
public static final String[] columnHeads = {"Col 1", "Col 2", "Col 3"};
public static void main(String args[]) throws IOException {
Example example = new Example();
}
public Example() {
//Create Table Model
DefaultTableModel model = new DefaultTableModel();
for (int index …Run Code Online (Sandbox Code Playgroud) 我正在使用基于摇摆的应用程序JTable.我用DefaultCellEditor了一个需要组合框选择的列.但是DefaultCellEditor有许多我不需要的方法.所以我编写了一个自定义CellEditor,扩展AbstractCellEditor了我只实现了所需方法的地方.我的问题是
(一般情况下)如果我们有一个类,如果我们不需要该类的所有方法就可以使用它,或者编写一个自定义类,我们只实现我们需要的那些方法是否合适?和
通过使用自定义类,应用程序的性能(内存方面)将得到改进,还是与具有所有方法的类保持一致?
任何帮助将不胜感激.
我有一个带有自定义TreeModel和自定义TreeRenderer的JTree.树模型包含一堆不同类型的对象.其中一种类型的显示方式与其他类型不同:显示的文本是对象的两个字段的串联.当我编辑单元格时,我想用编辑的文本更新其中一个字段.到目前为止,我的工作得很好.
我的问题:当编辑时显示的文本是2个字段的完整连接值时,即使您实际上只是编辑其中一个字段,这也很令人困惑.所以我想只显示用户开始编辑时正在编辑的一个字段的内容.
我尝试使用自定义CellEditor来做这件事,我看到它应该工作的方式,这种方法在我的情况下似乎有点过分.我只是想在很多情况下改变显示的文本,所以我自然而然地希望实现它,而不是整个CellEditor来完成我的Tree的整个内容.
是否有更快速,更简单的方法,或者我必须使用自定义编辑器?
谢谢
我试图保持我JTable的紧张和安全,只有可编辑的列可编辑isCellEditable().但是,我的客户坚持要求他们双击一个单元格,以便他们可以复制其内容,即使它是只读的.我可以让单元格可编辑,而不对它们可以进行的任何编辑做任何事情setValueAt()(因此当编辑器退出时它会恢复原始值).但我不希望这个应用程序感觉如此自由.是否有一种简单有效的方法可以将JTextField用作单元格编辑器以允许在编辑器中选择文本,但不可编辑?
我在JTable下面尝试了这个覆盖,但我不认为我正在寻找正确的"instanceof"对象.
@Override
public TableCellEditor getDefaultEditor(Class<?> columnClass) {
if (super.getDefaultEditor(columnClass) instanceof JTextField) {
JTextField jTextField = new JTextField();
jTextField.setEditable(false);
return (TableCellEditor) jTextField;
}
if (columnClass == null) {
return null;
}
else {
Object editor = defaultEditorsByColumnClass.get(columnClass);
if (editor != null) {
return (TableCellEditor)editor;
}
else {
return getDefaultEditor(columnClass.getSuperclass());
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试JTable使用以下行为向a添加列(类似于Windows资源管理器和类似的shell):
双击不得触发单元格的编辑,但如果可能,我希望保留任何其他默认编辑触发器.
我曾尝试添加一个MouseListener表,并消耗所有MouseEventS,但这并不工作-如果我回到true从isCellEditable()那么我的听众从来没有收到任何点击事件,但如果我回到false然后F2不再起作用.
这可以仅使用事件监听器来实现吗?如果我可以避免它,我宁愿不搞乱PLAF功能.
当在JTable(Nimbus L&F)中编辑数据时,当用户从一个单元格切换到另一个单元格时,不清楚哪个单元格具有焦点.如何更清楚地说明哪个细胞有焦点?我知道有很多属性可以设置来修改Nimbus - 有谁知道我想要哪个属性?
下面的屏幕截图只有一个属性设置为默认值以外的其他属性:
UIManager.put("Table.showGrid", true);
Run Code Online (Sandbox Code Playgroud)

让我介绍一下我的问题的场景。我希望在 JTable 中呈现数据库表的内容。有了这个 JTable,我应该能够插入新行、删除行以及更新现有行的字段内容。
\n\n第一个期望的行为是,当单元格获得焦点时,如果它是可编辑的,则它会直接进入编辑模式,并且如果它是字母数字内容,则选择所有内容。(文本、数字、日期等)
\n\n下一个期望的行为是Enter按键作为按键工作Tab,即,按下Enter按键焦点必须向前(从左到右)或向后转移到下一个单元格(如果这是可编辑的,则进入编辑模式)。
为了满足第一个要求,我使用以下方法覆盖 JTable 类的changeSelection 方法。
\n\n@Override\npublic void changeSelection(int row, int column, boolean toggle, boolean extend) {\n super.changeSelection(row, column, toggle, extend);\n if (editCellAt(row, column)) {\n Component editor = getEditorComponent();\n editor.requestFocusInWindow();\n if (editor instanceof JFormattedTextField) {\n ((JFormattedTextField) editor).select(0,\n ((JFormattedTextField) editor).getText().length());\n } else if (editor instanceof JTextField) {\n ((JTextField) editor).selectAll();\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n在阅读了大量文档和帖子后,很明显解决问题的最合适方法是通过使用键绑定,基本上,读完之后,解决方案是将键的行为分配给Tab键Enter,我也这么做了。
private void tableConfiguration() {\n //Configuramos la tabla para que …Run Code Online (Sandbox Code Playgroud) java ×10
tablecelleditor ×10
jtable ×9
swing ×9
jcombobox ×1
jtextfield ×1
jtree ×1
key-bindings ×1
nimbus ×1
performance ×1