Setting a tooltip for a value from JComboBox's Items as CellEditor in JTable

前端 未结 2 1455
抹茶落季
抹茶落季 2020-12-11 13:08

I would like to set a tooltip value for the values in a custom combo box. Basically, my combobox contains a list of initials of people - when they hover over i want it to di

相关标签:
2条回答
  • 2020-12-11 13:39

    see JTable tutorial, test code examples, for example

    import java.awt.BorderLayout;
    import javax.swing.DefaultCellEditor;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.TableCellRenderer;
    import javax.swing.table.TableColumn;
    import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JList;
    import javax.swing.plaf.basic.BasicComboBoxRenderer;
    
    public class TableRenderDemo extends JPanel {
    
        private static final long serialVersionUID = 1L;
    
        public TableRenderDemo() {
            super(new BorderLayout(5, 5));
            final JTable table = new JTable(new MyTableModel());
            table.setPreferredScrollableViewportSize(table.getPreferredSize());
            table.setFillsViewportHeight(true);
            table.setRowHeight(20);
            JScrollPane scrollPane = new JScrollPane(table);
            initColumnSizes(table);
            setUpSportColumn(table, table.getColumnModel().getColumn(2));
            add(scrollPane, BorderLayout.CENTER);
            JButton resetButton = new JButton("Reset to default");
            resetButton.addActionListener(new ActionListener() {
    
                public void actionPerformed(ActionEvent e) {
                    for (int i = 0; i < table.getRowCount(); i++) {
                        table.getModel().setValueAt("None of the above", i, 2);
                    }
                }
            });
            add(resetButton, BorderLayout.SOUTH);
        }
    
        private void initColumnSizes(JTable table) {
            MyTableModel model = (MyTableModel) table.getModel();
            TableColumn column = null;
            Component comp = null;
            int headerWidth = 0;
            int cellWidth = 0;
            Object[] longValues = model.longValues;
            TableCellRenderer headerRenderer = table.getTableHeader().getDefaultRenderer();
            for (int i = 0; i < 5; i++) {
                column = table.getColumnModel().getColumn(i);
                comp = headerRenderer.getTableCellRendererComponent(null, column.getHeaderValue(), false, false, 0, 0);
                headerWidth = comp.getPreferredSize().width;
                comp = table.getDefaultRenderer(model.getColumnClass(i)).getTableCellRendererComponent(table, longValues[i], false, false, 0, i);
                cellWidth = comp.getPreferredSize().width;
                column.setPreferredWidth(Math.max(headerWidth, cellWidth));
            }
        }
    
        private void setUpSportColumn(JTable table, TableColumn sportColumn) {
            ArrayList<String> listSomeString = new ArrayList<String>();
            listSomeString.add("Snowboarding");
            listSomeString.add("Rowing");
            listSomeString.add("Knitting");
            listSomeString.add("Speed reading");
            listSomeString.add("Pool");
            listSomeString.add("None of the above");
            JComboBox comboBox = new JComboBox();
            comboBox.addItem(new Item(1, "-"));
            comboBox.addItem(new Item(2, "Snowboarding"));
            comboBox.addItem(new Item(3, "Rowing"));
            comboBox.addItem(new Item(4, "Knitting"));
            comboBox.addItem(new Item(5, "Speed reading"));
            comboBox.addItem(new Item(6, "Pool"));
            comboBox.addItem(new Item(7, "None of the above"));
            comboBox.setMaximumRowCount(3);
            comboBox.addActionListener(new ActionListener() {
    
                public void actionPerformed(ActionEvent e) {
                    JComboBox comboBox = (JComboBox) e.getSource();
                    Item item = (Item) comboBox.getSelectedItem();
                    System.out.println(item.getId() + " : " + item.getDescription());
                }
            });
            //comboBox.setRenderer(new ItemRenderer());
            sportColumn.setCellEditor(new DefaultCellEditor(comboBox));
            DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
            renderer.setToolTipText("Click for combo box");
            sportColumn.setCellRenderer(renderer);
        }
    
        class ItemRenderer extends BasicComboBoxRenderer {
    
            @Override
            public Component getListCellRendererComponent(JList list, Object value,
                    int index, boolean isSelected, boolean cellHasFocus) {
                super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                if (value != null) {
                    Item item = (Item) value;
                    setText(item.getDescription().toUpperCase());
                }
                if (index == -1) {
                    Item item = (Item) value;
                    setText("" + item.getId());
                }
                return this;
            }
        }
    
        class Item {
    
            private int id;
            private String description;
    
            public Item(int id, String description) {
                this.id = id;
                this.description = description;
            }
    
            public int getId() {
                return id;
            }
    
            public String getDescription() {
                return description;
            }
    
            @Override
            public String toString() {
                return description;
            }
        }
    
        class MyTableModel extends AbstractTableModel {
    
            private static final long serialVersionUID = 1L;
            private String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"};
            private Object[][] data = {{"Kathy", "Smith", "Snowboarding", new Integer(5), false},
                {"John", "Doe", "Rowing", new Integer(3), true}, {"Sue", "Black", "Knitting", new Integer(2), false},
                {"Jane", "White", "Speed reading", new Integer(20), true}, {"Joe", "Brown", "Pool", new Integer(10), false}};
            public final Object[] longValues = {"Jane", "Kathy", "None of the above", new Integer(20), Boolean.TRUE};
    
            @Override
            public int getColumnCount() {
                return columnNames.length;
            }
    
            @Override
            public int getRowCount() {
                return data.length;
            }
    
            @Override
            public String getColumnName(int col) {
                return columnNames[col];
            }
    
            @Override
            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
    
            @Override
            public Class<?> getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }
    
            @Override
            public boolean isCellEditable(int row, int col) {
                if (col < 2) {
                    return false;
                } else {
                    return true;
                }
            }
    
            @Override
            public void setValueAt(Object value, int row, int col) {
                data[row][col] = value;
                fireTableCellUpdated(row, col);
                System.out.println("New value of data: " + getValueAt(row, col));
            }
        }
    
        private static void createAndShowGUI() {
            JFrame frame = new JFrame("TableRenderDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            TableRenderDemo newContentPane = new TableRenderDemo();
            frame.setContentPane(newContentPane);
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }
    
    0 讨论(0)
  • 2020-12-11 13:52

    If you want tooltips in the editing combobox, you'll have to so in a custom renderer of that combobox. Below is a short example:

    // some data
    User[] users = new User[] { 
            new User("Clara Zetkin", "CZ"),
            new User("Rosa Luxemburg", "RL"),
            new User("Susan Sontag", "SS"),
    };
    // the renderer for use in the editor
    ListCellRenderer comboRenderer = new DefaultListCellRenderer() {
    
        @Override
        public Component getListCellRendererComponent(JList<?> list,
                Object value, int index, boolean isSelected,
                boolean cellHasFocus) {
            if (value instanceof User) {
                setToolTipText(((User) value).getName());
                value = ((User) value).getInitials();
            } else {
                setToolTipText(null);
            }
            return super.getListCellRendererComponent(list, value, index, isSelected,
                    cellHasFocus);
        }
    
    };
    JComboBox editingCombo = new JComboBox(users);
    editingCombo.setRenderer(comboRenderer);
    
    JTable table = new JTable(3, 2);
    // set up the editor for the first column
    table.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(editingCombo));
    // the renderer to use in the table
    TableCellRenderer renderer = new DefaultTableCellRenderer() {
    
        @Override
        protected void setValue(Object value) {
            if (value instanceof User) {
                setToolTipText(((User) value).getInitials());
                value = ((User) value).getName();
            } else {
                setToolTipText(null);
            }
            super.setValue(value);
        }
    
    };
    table.getColumnModel().getColumn(0).setCellRenderer(renderer);
    
    0 讨论(0)
提交回复
热议问题