Sal*_*eek 1 java swing jtable tablecelleditor tablecellrenderer
我正在学习这个使用TableDialogEditDemo.java示例类的oracle教程
我为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);
...
...
Run Code Online (Sandbox Code Playgroud)
(更新说明)当我单击一个单元格时,会弹出一个输入对话框,这是正常的,当我输入文本并单击"确定"时,JTable中的单元格会更新,但文本不会正确显示/呈现,I必须单击任何其他单元格才能使单元格中的文本内容正确显示.
我的代码有什么问题?
我的渲染器
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我的编辑(更新)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我是这个问题的作者,我解决了这个问题.我将提供解决方案,以便其他人可以从中获得帮助.
我正在尝试编写自定义渲染器和自定义编辑器以与JTable一起使用.渲染器只是使用JLabel来显示数据.它已经是JTable的标准组件.编辑器是一个对话框,在单击要编辑的单元格时出现.
这是解决方案:
保持不变的类是Oracle +我的自定义渲染器类中的三个类
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这样可以
您还可以对渲染器类"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;
}
}
Run Code Online (Sandbox Code Playgroud)
问候.