Swing/ListOverflowWithFadeScroll のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ListOverflowWithFadeScroll へ行く。
- 1 (2025-10-06 (月) 03:26:23)
- 2 (2025-10-06 (月) 03:35:54)
- category: swing folder: ListOverflowWithFadeScroll title: JScrollPaneからあふれるJListのアイテムをフェイドアウト表示する tags: [JScrollPane, JLayer, JList] author: aterai pubdate: 2025-10-06T03:23:49+09:00 description: JScrollPaneの上下からあふれるJListのリストアイテムが存在する場合、それをフェイドアウト効果で表示するよう設定します。 image: https://drive.google.com/uc?id=1o6hLUHfaGUlG03CAnuJEDPT0zKpXM54q
Summary
JScrollPaneの上下からあふれるJListのリストアイテムが存在する場合、それをフェイドアウト効果で表示するよう設定します。
Screenshot

Advertisement
Source Code Examples
class FadeScrollLayerUI extends LayerUI<JScrollPane> {
public static final int OVERFLOW = 32;
@Override public void paint(Graphics g, JComponent c) {
super.paint(g, c);
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(
RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(new Color(0x12_FF_FF_FF, true));
if (c instanceof JLayer) {
JScrollPane scroll = (JScrollPane) ((JLayer<?>) c).getView();
Rectangle r = scroll.getViewportBorderBounds();
BoundedRangeModel m = scroll.getVerticalScrollBar().getModel();
g2.setClip(r);
if (m.getMinimum() < m.getValue()) {
for (int i = OVERFLOW; i > 0; i--) {
g2.fillRect(0, r.y - i, r.width, OVERFLOW - i);
}
}
if (m.getValue() + m.getExtent() < m.getMaximum()) {
g2.translate(r.x, r.y + r.height - OVERFLOW);
for (int i = 0; i < OVERFLOW; i++) {
g2.fillRect(0, i, r.width, OVERFLOW - i);
}
}
}
g2.dispose();
}
}
View in GitHub: Java, KotlinDescription
JScrollPaneにJLayerを設定し、JLayer#paint(...)をオーバーライドしてJListの上下辺付近のあふれを半透明の白色で上書きすることでフェードアウト効果で描画している- 背景が白色以外の
JListやダークモードなどには未対応
- 背景が白色以外の
JListではなくJTableなどでもフェードスクロール可能だが、上辺にJTableHeaderが配置されることを考慮していないので、行ではなくヘッダがフェードアウトしてしまう- 上辺のフェードアウト効果を描画する前に
g2.setClip(scroll.getViewportBorderBounds());で描画領域を制限することで回避可能
- 上辺のフェードアウト効果を描画する前に