【问题标题】:How to display a text above a JTable cell when editing编辑时如何在 JTable 单元格上方显示文本
【发布时间】:2012-05-29 17:53:49
【问题描述】:

当有人编辑单元格时,我想在 JTable 单元格上方显示文本。文本与工具提示几乎相同,但只有在编辑单元格时才应显示文本,并且文本应保留到编辑完成。

我怎样才能实现这样的行为?

到目前为止,我尝试的是覆盖 JTablegetCellEditor 方法,但这只会设置标准工具提示,但我需要在编辑时永久显示文本。

@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;
}

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

    另一种选择是在您开始编辑单元格时也添加一个 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);
            }
        }
    
    }
    

    【讨论】:

    • 完美解决方案。正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2011-12-19
    • 2013-05-30
    • 2015-03-24
    相关资源
    最近更新 更多