java - JTable:如何通过弹出输入对话框使用自定义编辑器更新单元格?

标签 java swing jtable tablecellrenderer tablecelleditor

我正在从中学习 oracle tutorial使用 TableDialogEditDemo.java示例类

我为 JTable 编写了自定义单元格渲染器和编辑器。

我将它们注册到这个 Oracle TableDialogEditDemo.java

        ...
        ...
        //Set up renderer and editor for the Favorite Color column.
        table.setDefaultRenderer(Color.class,
                                 new ColorRenderer(true));
        table.setDefaultEditor(Color.class,
                               new ColorEditor());

        TableColumn c = table.getColumnModel().getColumn(2);
        c.setCellRenderer(new CellStringRenderer()); //My custom Renderer
        c.setCellEditor(new CellStringEditor()); // My custom Editor

        //Add the scroll pane to this panel.
        add(scrollPane);
        ...
        ...

(更新描述) 当我单击一个单元格时,会弹出一个输入对话框,这是确定的,当我键入文本并单击“确定”时,JTable 中的单元格已更新,但文本未正确显示/呈现,我必须单击任何其他单元格以使文本内容在单元格中正确显示。

我的代码有什么问题?

我的渲染器

import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class CellStringRenderer extends JLabel implements TableCellRenderer
{

    public CellStringRenderer()
    {
        this.setOpaque(true);
    }


    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
       String stringValue = (String) value;
       this.setText(stringValue);
       return this;
    }

}

我的编辑器(已更新)

import java.awt.Component;
import javax.swing.*;
import javax.swing.table.TableCellEditor;


public class CellStringEditor extends AbstractCellEditor
        implements TableCellEditor
{

    String input;

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
    {
        if (isSelected)
        {
            JOptionPane dialog = new JOptionPane();
            input = dialog.showInputDialog(null, "new value");
            return dialog;   
        }
        return null;
    }

    @Override
    public Object getCellEditorValue()
    {
        return input;
    }
}

最佳答案

我是这个问题的作者,我解决了它。我将提供解决方案,以便其他人可以从中获得帮助。

我试图编写一个自定义渲染器和一个自定义编辑器以与 JTable 一起使用。 渲染器只是使用 JLabel 来显示数据。它已经是 JTable 的标准组件。 编辑器是单击我要编辑的单元格时出现的对话框。

解决方法如下:

将保持不变的类是来自 Oracle 的三个类 + 我的自定义渲染器类

1. TableDialogEditDemo.java .

2。 ColorEditor.java

3。 ColorRenderer.java

4.上面题体中提供的CellStringRenderer类(我的类)

将要更新的类是自定义编辑器类(我把它的名字从“CellStringEditor”改成了“DialogStringEditor”

import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;

public class DialogStringEditor extends AbstractCellEditor
        implements TableCellEditor,
        ActionListener
{

    String newInput;
    String oldValue;
    JButton button;
    static final String EDIT = "edit";

    public DialogStringEditor()
    {
        button = new JButton();
        button.setBackground(Color.WHITE);
        button.setActionCommand(EDIT);
        button.addActionListener(this);
        button.setBorderPainted(false);
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        if (EDIT.equals(e.getActionCommand()))
        {
            newInput = JOptionPane.showInputDialog("Edit", oldValue);
            if (newInput == null)
            {
                newInput = oldValue;
            }
            fireEditingStopped();
        }
    }

    @Override
    public Object getCellEditorValue()
    {
        return newInput;
    }

    @Override
    public Component getTableCellEditorComponent(JTable table,
            Object value,
            boolean isSelected,
            int row,
            int column)
    {
        newInput = (String) value;
        oldValue = (String) value;
        return button;
    }
}

这样就可以了

您还可以对渲染器类“CellStringRenderer”进行一些更新,以控制单元格选择和取消选择颜色的显示方式。

更新此方法:

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        String stringValue = (String) value;
        this.setText(stringValue);

        if (isSelected)
        {
            this.setBackground(table.getSelectionBackground());
            this.setForeground(table.getSelectionForeground());
        } else
        {
            this.setBackground(table.getBackground());
            this.setForeground(table.getForeground());
        }

        return this;
    }
}

问候。

关于java - JTable:如何通过弹出输入对话框使用自定义编辑器更新单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14153544/

相关文章:

java - Class.forName 如何返回 Class<?扩展我的抽象类>?

java - 将 mp3 转换为 LINEAR_16 或 FLAC 格式以用于谷歌云语音

java - UISpec4J - AbstractMethodError(UISpecToolkit.createKeyboardFocusManagerPeer)

java - 从另一个类访问 GUI 组件

java - 在 JOptionPane.showOptionDialog 中启用最小化选项

java - 使用 JTextFields 中的字符串填充 JTable

java - 拖动鼠标时行和列损坏

java - W/System.err : org. json.JSONException : Value Database of type java. lang.String 无法转换为 JSONObject

java - 在 Maven 项目中与依赖项共享单元测试

java - 为 JTable 设置特定行的边距和自定义边框