TableCellRenderer
セル内のマウスの位置に応じて異なるツールチップを表示したいカスタムがあります。私が直面している問題は、から呼び出されたときにgetWidth()
常に返されることです。0
getToolTipText
SSCCE は次のとおりです。
import javax.swing.*;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.awt.event.MouseEvent;
public class Sandbox {
public static void main(String[] args) {
JFrame testFrame = new JFrame("Test");
testFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
testFrame.setLayout(new BorderLayout());
JTable testTable = new JTable(new Object[][]{{"Value 1", null}}, new Object[] {"Column 1", "Column 2"});
testTable.getColumnModel().getColumn(1).setCellRenderer(new CustomCellRenderer());
testFrame.add(new JScrollPane(testTable), BorderLayout.CENTER);
testFrame.pack();
testFrame.setLocationRelativeTo(null);
testFrame.setVisible(true);
}
private static class CustomCellRenderer implements TableCellRenderer {
private final JLabel renderer = new JLabel()
{
@Override
protected void paintComponent(Graphics g) {
g.setColor(Color.RED);
g.fillRect(0, 0, getWidth(), getHeight());
System.out.println("Width from paintComponent = " + getWidth());
}
@Override
public String getToolTipText(MouseEvent event) {
System.out.println("Width from getToolTipText = " + getWidth());
return super.getToolTipText(event);
}
};
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
{
return renderer;
}
}
}
paintComponent
コンポーネントのサイズが変更され、正しい結果がメソッドから出力されていることがわかります。ただし、「列 2」のセルにマウスを合わせると、getToolTipText
メソッドは同じ値を出力しません。
以前にも似たような質問がありましたが、答えは一般的にComponent
まだサイズが決まっていないというものです。私の場合、コンポーネントは明らかにサイズ変更されています。誰かがメソッドでgetWidth()
戻る理由を説明できますか? これを行うより良い方法はありますか?0
getToolTipText