Swing/TabThumbnail のバックアップの現在との差分(No.4)
TITLE:JTabbedPaneのサムネイルをJToolTipsで表示
JTabbedPaneのサムネイルをJToolTipsで表示
Posted by terai at 2006-07-31- category: swing folder: TabThumbnail title: JTabbedPaneのサムネイルをJToolTipで表示 tags: [JToolTip, JTabbedPane] author: aterai pubdate: 2006-07-31T12:28:44+09:00 description: ツールチップを使って、JTabbedPaneのサムネイルを表示します。 image:
概要
ツールチップを使って、JTabbedPane
のサムネイルを表示します。
Screenshot
Advertisement
概要
ツールチップを使って、JTabbedPaneのサムネイルを表示します。サンプルコード
#spanend
#spanadd
class TabThumbnailTabbedPane extends JTabbedPane {
#spanend
private int current = -1;
private static final double SCALE = .15;
private Component getTabThumbnail(int index) {
Component c = getComponentAt(index);
Icon icon = null;
if (c instanceof JScrollPane) {
c = ((JScrollPane) c).getViewport().getView();
Dimension d = c.getPreferredSize();
int newW = (int) (d.width * SCALE);
int newH = (int) (d.height * SCALE);
BufferedImage image = new BufferedImage(
newW, newH, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = image.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.scale(SCALE, SCALE);
c.paint(g2);
g2.dispose();
icon = new ImageIcon(image);
} else if (c instanceof JLabel) {
icon = ((JLabel) c).getIcon();
}
return new JLabel(icon);
}
-&jnlp;
-&jar;
-&zip;
@Override public JToolTip createToolTip() {
int index = current;
if (index < 0) {
return null;
}
#spandel
#screenshot
#spanend
JPanel p = new JPanel(new BorderLayout());
p.setBorder(BorderFactory.createEmptyBorder());
p.add(new JLabel(getTitleAt(index)), BorderLayout.NORTH);
p.add(getTabThumbnail(index));
#spandel
**サンプルコード [#o54faaa7]
#spanend
#spandel
#code{{
#spanend
#spandel
class MyTabbedPane extends JTabbedPane {
#spanend
private final JToolTip tip;
private int current = -1;
public MyTabbedPane() {
super();
tip = super.createToolTip();
}
public JToolTip createToolTip() {
initToolTip(tip, current);
JToolTip tip = new JToolTip() {
@Override public Dimension getPreferredSize() {
Insets i = getInsets();
Dimension d = p.getPreferredSize();
return new Dimension(
d.width + i.left + i.right, d.height + i.top + i.bottom);
}
};
tip.setComponent(this);
LookAndFeel.installColorsAndFont(
p, "ToolTip.background", "ToolTip.foreground", "ToolTip.font");
tip.setLayout(new BorderLayout());
tip.add(p);
return tip;
}
public String getToolTipText(MouseEvent e) {
#spanadd
#spanend
@Override public String getToolTipText(MouseEvent e) {
int index = indexAtLocation(e.getX(), e.getY());
String str = (current!=index)?null:super.getToolTipText(e);
String str = (current == index) ? super.getToolTipText(e) : null;
current = index;
return str;
}
private final double scale = 0.2d;
private void initToolTip(JToolTip tip, int index) {
tip.removeAll();
JPanel panel = new JPanel(new BorderLayout());
if(index<0) {
return;
}
String str = getTitleAt(index);
panel.add(new JLabel(str), BorderLayout.NORTH);
Component c = getComponentAt(index);
if(c instanceof JScrollPane) {
c = ((JScrollPane)c).getViewport().getView();
}
final BufferedImage image = new BufferedImage(
c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics g = image.getGraphics();
c.paint(g);
JPanel pnl = new JPanel() {
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.scale(scale,scale);
g2.drawImage(image, 0, 0, this);
}
};
pnl.setOpaque(true);
panel.add(pnl, BorderLayout.CENTER);
tip.setBorder(BorderFactory.createLineBorder(Color.BLACK));
tip.setLayout(new BorderLayout());
tip.add(panel, BorderLayout.CENTER);
Dimension d = new Dimension(
(int)(c.getWidth()*scale), (int)(c.getHeight()*scale));
tip.setPreferredSize(d);
}
}
View in GitHub: Java, Kotlin解説
マウスカーソルがタブタイトル上にきた場合、そのタブ内部のコンポーネントを縮小してJToolTipに貼り付けています。解説
- 選択されたタブではなく、マウスカーソルが存在するタブコンテンツの内部コンポーネントを縮小して
BufferedImage
を作成 - 縮小した
BufferedImage
からImageIcon
を作成、JLabel#setIcon(...)
でコンポーネントに変換してJToolTip
に配置