skip to main
|
skip to sidebar
小虫玩電腦
2009-04-09
如何讓設定 FlowLayout 的 JPanel 有 ScrollBar
因為 JDK 的
bug
,設定 FlowLayout 的 JPanel 沒辦法在 JScrollPane 裡面正確呈現出 ScrollBar,因此要自己實作
Scrollable
來達到這個效果。
import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Rectangle; import javax.swing.JPanel; import javax.swing.Scrollable; import javax.swing.SwingConstants; public class ScrollableFlowPanel extends JPanel implements Scrollable { public void setBounds(int x, int y, int width, int height) { super.setBounds(x, y, getParent().getWidth(), height); } public Dimension getPreferredSize() { return new Dimension(getWidth(), getPreferredHeight()); } public Dimension getPreferredScrollableViewportSize() { return super.getPreferredSize(); } public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { int hundredth = (orientation == SwingConstants.VERTICAL ? getParent() .getHeight() : getParent().getWidth()) / 100; return (hundredth == 0 ? 1 : hundredth); } public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { return orientation == SwingConstants.VERTICAL ? getParent().getHeight() : getParent().getWidth(); } public boolean getScrollableTracksViewportWidth() { return true; } public boolean getScrollableTracksViewportHeight() { return false; } private int getPreferredHeight() { int rv = 0; for (int k = 0, count = getComponentCount(); k < count; k++) { Component comp = getComponent(k); Rectangle r = comp.getBounds(); int height = r.y + r.height; if (height > rv) rv = height; } rv += ((FlowLayout) getLayout()).getVgap(); return rv; } }
測試
import java.awt.*; import javax.swing.*; public class TestScrollableFlowPanel extends JFrame { public static void main( String[] args ) { Runnable doEDT = new Runnable() { public void run() { new TestScrollableFlowPanel(); } }; SwingUtilities.invokeLater( doEDT ); } public TestScrollableFlowPanel() { try { jbInit(); } catch ( Exception e ) { e.printStackTrace(); } this.setSize( 300, 300 ); this.setDefaultCloseOperation( EXIT_ON_CLOSE ); this.setVisible( true ); } private void jbInit() throws Exception { ScrollableFlowPanel panel = new ScrollableFlowPanel(); for ( int k = 0; k < 120; k++ ) panel.add( new JButton( "Button" + k ) ); JScrollPane scroll = new JScrollPane( panel ); this.getContentPane().setLayout( new BorderLayout() ); this.getContentPane().add( scroll, BorderLayout.CENTER ); } }
這問是困擾了我兩天, sun 竟然這麼久都不修復,唉。
沒有留言:
張貼留言
較新的文章
較舊的文章
首頁
訂閱:
張貼留言 (Atom)
分類
軟體
(12)
單車
(2)
程式
(4)
網路
(6)
環島
(1)
adblock
(1)
android
(2)
Cloud
(1)
css
(1)
Database
(2)
dot net
(1)
eclipse
(2)
git
(1)
groovy
(1)
html
(1)
ios
(5)
ipad
(1)
iphone
(1)
java
(23)
Javascript
(3)
jquery
(1)
Linux
(4)
mac
(4)
network
(1)
Oracle
(1)
safari
(1)
svn
(1)
test
(1)
titanium
(1)
USB、病毒
(1)
virtualbox
(1)
vnc
(1)
vpn
(1)
web
(1)
Windows
(12)
xcode
(1)
xp
(1)
每月文章彙集
►
2022
(4)
►
4月
(1)
►
3月
(1)
►
1月
(2)
►
2020
(1)
►
3月
(1)
►
2019
(1)
►
6月
(1)
►
2018
(2)
►
10月
(1)
►
1月
(1)
►
2014
(5)
►
9月
(2)
►
7月
(1)
►
3月
(1)
►
1月
(1)
►
2013
(2)
►
2月
(1)
►
1月
(1)
►
2012
(4)
►
11月
(1)
►
7月
(1)
►
6月
(1)
►
3月
(1)
►
2011
(9)
►
9月
(4)
►
8月
(1)
►
6月
(1)
►
1月
(3)
▼
2009
(37)
►
9月
(1)
►
8月
(2)
►
6月
(5)
►
5月
(3)
▼
4月
(6)
Eclipse 中 將Java Project 轉換為Dynamic Web Project
Notepad++ Regular Expression 的使用
數字拆解問題
Eclipse 中文化
運用 command 來批次改檔名
如何讓設定 FlowLayout 的 JPanel 有 ScrollBar
►
3月
(6)
►
2月
(7)
►
1月
(7)
►
2008
(32)
►
12月
(21)
►
10月
(2)
►
9月
(2)
►
8月
(3)
►
3月
(4)
►
2005
(2)
►
9月
(2)
►
2004
(1)
►
12月
(1)
關於小蟲
小虫
檢視我的完整簡介
追蹤者
沒有留言:
張貼留言