标签: tablecelleditor

为什么在编辑JTable单元格时按下escape时未调用cancelCellEditing()?

我有一个可编辑的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)?

java jtable tablecelleditor

7
推荐指数
1
解决办法
2320
查看次数

JTable单元编辑器编号格式

我需要在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)

java swing jtable tablecelleditor number-formatting

7
推荐指数
1
解决办法
2万
查看次数

使用TableCellEditor时,如何在鼠标单击位置获取组件?

我在表格单元格中使用了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)

java swing jtable tablecelleditor mouselistener

7
推荐指数
1
解决办法
9098
查看次数

当单元格中的JComboBox中有ItemEvent时,如何获取CellRow

我有一个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)

java swing jtable tablecelleditor jcombobox

6
推荐指数
1
解决办法
7962
查看次数

java类的大小是否会影响应用程序的性能

我正在使用基于摇摆的应用程序JTable.我用DefaultCellEditor了一个需要组合框选择的列.但是DefaultCellEditor有许多我不需要的方法.所以我编写了一个自定义CellEditor,扩展AbstractCellEditor了我只实现了所需方法的地方.我的问题是

(一般情况下)如果我们有一个类,如果我们不需要该类的所有方法就可以使用它,或者编写一个自定义类,我们只实现我们需要的那些方法是否合适?和

通过使用自定义类,应用程序的性能(内存方面)将得到改进,还是与具有所有方法的类保持一致?

任何帮助将不胜感激.

java performance swing jtable tablecelleditor

6
推荐指数
1
解决办法
834
查看次数

简单快速的JTree Cell Editor

我有一个带有自定义TreeModel和自定义TreeRenderer的JTree.树模型包含一堆不同类型的对象.其中一种类型的显示方式与其他类型不同:显示的文本是对象的两个字段的串联.当我编辑单元格时,我想用编辑的文本更新其中一个字段.到目前为止,我的工作得很好.

我的问题:当编辑时显示的文本是2个字段的完整连接值时,即使您实际上只是编辑其中一个字段,这也很令人困惑.所以我想只显示用户开始编辑时正在编辑的一个字段的内容.

我尝试使用自定义CellEditor来做这件事,我看到它应该工作的方式,这种方法在我的情况下似乎有点过分.我只是想在很多情况下改变显示的文本,所以我自然而然地希望实现它,而不是整个CellEditor来完成我的Tree的整个内容.

是否有更快速,更简单的方法,或者我必须使用自定义编辑器?

谢谢

java swing jtree tablecelleditor

6
推荐指数
1
解决办法
6262
查看次数

使JTable单元格编辑器值可选,但不可编辑?

我试图保持我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)

java swing jtable jtextfield tablecelleditor

6
推荐指数
2
解决办法
3974
查看次数

使JTable单元格可编辑 - 但*不*通过双击

我正在尝试JTable使用以下行为向a添加列(类似于Windows资源管理器和类似的shell):

  • 像往常一样,可以单击一次单元格以选择它.
  • 可以双击单元格以执行单独的操作(启动外部程序.)
  • 单元格值(字符串)仍然可以通过单击第二次(暂停后)或按下F2单元格突出显示时进行编辑.

双击不得触发单元格的编辑,但如果可能,我希望保留任何其他默认编辑触发器.

我曾尝试添加一个MouseListener表,并消耗所有MouseEventS,但这并不工作-如果我回到trueisCellEditable()那么我的听众从来没有收到任何点击事件,但如果我回到false然后F2不再起作用.

这可以仅使用事件监听器来实现吗?如果我可以避免它,我宁愿不搞乱PLAF功能.

java swing jtable tablecelleditor

5
推荐指数
1
解决办法
1万
查看次数

JTable Nimbus外观 - 如何清楚哪个单元格具有焦点

当在JTable(Nimbus L&F)中编辑数据时,当用户从一个单元格切换到另一个单元格时,不清楚哪个单元格具有焦点.如何更清楚地说明哪个细胞有焦点?我知道有很多属性可以设置来修改Nimbus - 有谁知道我想要哪个属性?

下面的屏幕截图只有一个属性设置为默认值以外的其他属性:

UIManager.put("Table.showGrid", true);
Run Code Online (Sandbox Code Playgroud)

JTable屏幕截图

java swing jtable tablecelleditor nimbus

5
推荐指数
1
解决办法
2949
查看次数

Java JTable 如何在按下回车键时将焦点从编辑模式下的当前单元格转移到下一个单元格

让我介绍一下我的问题的场景。我希望在 JTable 中呈现数据库表的内容。有了这个 JTable,我应该能够插入新行、删除行以及更新现有行的字段内容。

\n\n

第一个期望的行为是,当单元格获得焦点时,如果它是可编辑的,则它会直接进入编辑模式,并且如果它是字母数字内容,则选择所有内容。(文本、数字、日期等)

\n\n

下一个期望的行为是Enter按键作为按键工作Tab,即,按下Enter按键焦点必须向前(从左到右)或向后转移到下一个单元格(如果这是可编辑的,则进入编辑模式)。

\n\n

为了满足第一个要求,我使用以下方法覆盖 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在阅读了大量文档和帖子后,很明显解决问题的最合适方法是通过使用键绑定,基本上,读完之后,解决方案是将键的行为分配给TabEnter,我也这么做了。

\n\n
private void tableConfiguration() {\n    //Configuramos la tabla para que …
Run Code Online (Sandbox Code Playgroud)

java swing jtable key-bindings tablecelleditor

5
推荐指数
1
解决办法
2707
查看次数