Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
188 views
in Technique[技术] by (71.8m points)

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

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 display the fullname of the person. My combo box is basically a cell/column of a JTable that has its own TableCellRenderer and DefaultCellEditor. The list is a JList (inner class within the model) - iv tried setting the 'setToolTipText' method directly but that doesnt seem to work.

Here is the code:

*Code within the JTable: *

public void setupUserCombo(Container container){
      TableColumn col = getColumnModel().getColumn(3);
      Set<ComboUser> values = new LinkedHashSet<ComboUser>();

      ComboUser comboUser = new ComboUser(new User("Test User"));
      values.add(comboUser);

      col.setCellEditor(new MyComboBoxEditor((ComboUser[])values.toArray(new ComboUser[0])));
      col.setCellRenderer(new MyComboBoxRenderer((ComboUser[])values.toArray(new ComboUser[0])));
      repaint();
}

public class MyComboBoxRenderer extends JComboBox implements TableCellRenderer {
    private static final long serialVersionUID = 1L;

    public MyComboBoxRenderer(ComboUser[] items) {
        super(items);
        repaint();
    }

    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        if (value != null){
            System.out.println("Setting tooltip");
            ((ComboUser)value).setToolTipText("TESTING!!");
        }
        setSelectedItem(value);

        return this;
    }
}

public class MyComboBoxEditor extends DefaultCellEditor {
    private static final long serialVersionUID = 1L;

    public MyComboBoxEditor(ComboUser[] items) {
        super(new JComboBox(items));
    }
}

*Subclass within the model: *

public class ComboUser extends JLabel{

    private User user;

    public ComboUser(User user){
        if (user != null){
            this.user = user;
        } else {
            this.user = new User("");
        }
    }

    @Override
    public String toString() {
        return user.getInitials();
    }
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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);

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...