Java 编辑时如何在JTable单元格上方显示文本
当有人编辑JTable单元格时,我想在该单元格上方显示文本。该文本与工具提示基本相同,但有一个例外,即该文本仅应在编辑单元格时显示,并且该文本应一直保留到编辑完成 我怎么能做出这样的行为 到目前为止,我尝试的是覆盖Java 编辑时如何在JTable单元格上方显示文本,java,swing,jtable,Java,Swing,Jtable,当有人编辑JTable单元格时,我想在该单元格上方显示文本。该文本与工具提示基本相同,但有一个例外,即该文本仅应在编辑单元格时显示,并且该文本应一直保留到编辑完成 我怎么能做出这样的行为 到目前为止,我尝试的是覆盖JTable的getCellEditor方法,但这只会设置标准工具提示,但我需要在编辑时永久显示文本 @Override public TableCellEditor getCellEditor(int row, int column) { TableCellEditor ed
JTable
的getCellEditor
方法,但这只会设置标准工具提示,但我需要在编辑时永久显示文本
@Override
public TableCellEditor getCellEditor(int row, int column) {
TableCellEditor editor = super.getCellEditor(row, column);
Component component = editor.getTableCellEditorComponent(this, getValueAt(row, column), isCellSelected(row, column), row, column);
if(component instanceof JTextField) {
JTextField textfield = (JTextField) component;
textfield.setToolTipText("tooltip");
}
return editor;
}
另一个选项是在开始编辑单元格时也添加JLabel(或任何组件)。无论何时停止,都会删除该组件 由于希望工具提示/标签显示在已编辑的单元格上方,因此需要对第一行使用一些技巧 下面是一个例子,说明了我的意思:
import java.awt.Container;
import java.awt.Point;
import java.util.EventObject;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
public class TestTable {
public JFrame f;
private JLabel tooltip;
private MyTable table;
public class MyTable extends JTable {
@Override
public boolean editCellAt(int row, int column, EventObject e) {
boolean editCellAt = super.editCellAt(row, column, e);
if (editCellAt) {
Point editedCellLocation = getCellRect(getEditingRow(), getEditingColumn(), true).getLocation();
if (tooltip != null) {
removeTooltip();
}
tooltip = new JLabel("Hello some nice tooltip");
tooltip.setOpaque(true);
tooltip.setSize(tooltip.getPreferredSize());
if (getEditingRow() == 0) {
tooltip.setLocation(editedCellLocation.x, getTableHeader().getHeight() - tooltip.getHeight());
getTableHeader().add(tooltip);
} else {
tooltip.setLocation(editedCellLocation.x, editedCellLocation.y - tooltip.getHeight());
add(tooltip);
}
((JComponent) tooltip.getParent()).repaint(tooltip.getBounds());
}
return editCellAt;
}
@Override
public void editingStopped(ChangeEvent e) {
super.editingStopped(e);
removeTooltip();
}
protected void removeTooltip() {
if (tooltip != null) {
Container parent = tooltip.getParent();
parent.remove(tooltip);
((JComponent) parent).repaint(tooltip.getBounds());
tooltip = null;
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestTable().initUI();
}
});
}
protected void initUI() {
table = new MyTable();
table.setModel(new TestTableModel());
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300, 300);
f.setLocationRelativeTo(null);
f.add(new JScrollPane(table));
f.setVisible(true);
}
public class TestTableModel extends DefaultTableModel {
public TestTableModel() {
super(new String[] { "DATA" }, 3);
setValueAt(Double.valueOf(-0.1), 0, 0);
setValueAt(Double.valueOf(+0.1), 1, 0);
setValueAt(Double.valueOf(0), 2, 0);
}
}
}
另一个选项是在开始编辑单元格时也添加JLabel(或任何组件)。无论何时停止,都会删除该组件 由于希望工具提示/标签显示在已编辑的单元格上方,因此需要对第一行使用一些技巧 下面是一个例子,说明了我的意思:
import java.awt.Container;
import java.awt.Point;
import java.util.EventObject;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
public class TestTable {
public JFrame f;
private JLabel tooltip;
private MyTable table;
public class MyTable extends JTable {
@Override
public boolean editCellAt(int row, int column, EventObject e) {
boolean editCellAt = super.editCellAt(row, column, e);
if (editCellAt) {
Point editedCellLocation = getCellRect(getEditingRow(), getEditingColumn(), true).getLocation();
if (tooltip != null) {
removeTooltip();
}
tooltip = new JLabel("Hello some nice tooltip");
tooltip.setOpaque(true);
tooltip.setSize(tooltip.getPreferredSize());
if (getEditingRow() == 0) {
tooltip.setLocation(editedCellLocation.x, getTableHeader().getHeight() - tooltip.getHeight());
getTableHeader().add(tooltip);
} else {
tooltip.setLocation(editedCellLocation.x, editedCellLocation.y - tooltip.getHeight());
add(tooltip);
}
((JComponent) tooltip.getParent()).repaint(tooltip.getBounds());
}
return editCellAt;
}
@Override
public void editingStopped(ChangeEvent e) {
super.editingStopped(e);
removeTooltip();
}
protected void removeTooltip() {
if (tooltip != null) {
Container parent = tooltip.getParent();
parent.remove(tooltip);
((JComponent) parent).repaint(tooltip.getBounds());
tooltip = null;
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestTable().initUI();
}
});
}
protected void initUI() {
table = new MyTable();
table.setModel(new TestTableModel());
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300, 300);
f.setLocationRelativeTo(null);
f.add(new JScrollPane(table));
f.setVisible(true);
}
public class TestTableModel extends DefaultTableModel {
public TestTableModel() {
super(new String[] { "DATA" }, 3);
setValueAt(Double.valueOf(-0.1), 0, 0);
setValueAt(Double.valueOf(+0.1), 1, 0);
setValueAt(Double.valueOf(0), 2, 0);
}
}
}
完美的解决方案。正是我想要的。完美的解决方案。这正是我想要的。