3

私は持っていJTableます。1 つの列には、JPanelを含むJLabelsが保持されますImageIcons。カスタム セル レンダリングを作成しましたJLabel。これらのいずれかにマウスを合わせると、その特定のJLabelsを表示する必要があります。のツールクリップが表示されていません。TooltipJLabelJLabel

これがCustomRendererです。

private class CustomRenderer extends
            DefaultTableCellRenderer implements TableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {   

            if (value != null && value instanceof List) {

                JPanel iconsPanel = new JPanel(new GridBagLayout());
                List<ImageIcon> iconList = (List<ImageIcon>) value;
                int xPos = 0;
                for (ImageIcon icon : iconList) {
                    JLabel iconLabel = new JLabel(icon);
                    iconLabel.setToolTipText(icon.getDescription());
                    GridBagConstraints gbc = new GridBagConstraints();
                    gbc.gridy = 1;
                    gbc.gridx = xPos++;
                    iconsPanel.add(iconLabel, gbc);
                }
                iconsPanel.setBackground(isSelected ? table
                        .getSelectionBackground() : table.getBackground());
                this.setVerticalAlignment(CENTER);
                return iconsPanel;
            }
            return this;
        }
    }
4

1 に答える 1

12

問題は、CellRenderer によって返されるコンポーネントのサブコンポーネントにツールチップを設定することです。必要なことを実行するgetToolTipText(MouseEvent e)には、JTable のオーバーライドを検討する必要があります。イベントから、次を使用して、マウスがどの行と列にあるかを見つけることができます。

java.awt.Point p = e.getPoint();
int rowIndex = rowAtPoint(p);
int colIndex = columnAtPoint(p);

そこから、セル レンダラーを再準備し、マウスの位置にあるコンポーネントを見つけて、最終的にそのツールチップを取得できます。

JTable getToolTipText をオーバーライドする方法のスニペットを次に示します。

@Override
public String getToolTipText(MouseEvent event) {
    String tip = null;
    Point p = event.getPoint();

    // Locate the renderer under the event location
    int hitColumnIndex = columnAtPoint(p);
    int hitRowIndex = rowAtPoint(p);

    if (hitColumnIndex != -1 && hitRowIndex != -1) {
        TableCellRenderer renderer = getCellRenderer(hitRowIndex, hitColumnIndex);
        Component component = prepareRenderer(renderer, hitRowIndex, hitColumnIndex);
        Rectangle cellRect = getCellRect(hitRowIndex, hitColumnIndex, false);
        component.setBounds(cellRect);
        component.validate();
        component.doLayout();
        p.translate(-cellRect.x, -cellRect.y);
        Component comp = component.getComponentAt(p);
        if (comp instanceof JComponent) {
            return ((JComponent) comp).getToolTipText();
        }
    }

    // No tip from the renderer get our own tip
    if (tip == null) {
        tip = getToolTipText();
    }

    return tip;
}
于 2012-06-01T18:17:57.420 に答える