參考:JAVA Swing--JTree實時刷新控制(刷新數據) http://fangguanhong.iteye.com/blog/1914115
JFrame界面問題添加超鏈接 http://www.vcsos.com/article/pageSource/120307/20120307110753.shtml
使用JFrame編寫類似QQ好友列表懸浮界面例子,JFrame初學 http://fangguanhong.iteye.com/blog/1838715
JTextArea自動換行以及設置滾動條 http://fangguanhong.iteye.com/blog/1920937
java swing 實現窗體靠邊自動伸縮隱藏 http://fangguanhong.iteye.com/blog/1913138
我在做一個swing程序的時候想做一個類似於文檔流的界面佈局:
在一個JPanel裏面動態放置一些面板(如jPanel),這些面板的尺寸大小都是相同的,考慮到不同尺寸屏幕的使用方便性來說,最好是當第一行滿時,會自動換行到第二行。如果超過了當前JPanle的高度,則會出現上下滾動條。
一開始我用JPanel+FlowLayout.LEFT佈局,倒是可以自動換行,但是發現當面板佔據空間的高度高於JPanel的高度時,沒有上下方向的滾動條出現,也就是說,下面的內容都被遮住了。
然後我在JPanel外面套了一個JScrollPane,卻發現內容會一直往右邊加,超出JPanel的寬度則出現橫向的滾動條,與預想的效果相差較大。
於是我把JScrollPane的horizontalScrollBarPolicy屬性設爲ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER,這回橫向滾動條沒了,但是圖片還是一直往右邊加,超出JPanle寬度部分被遮住了。
經過上網檢索資料,有一個方法可以實現,即繼承FLowLayout類,並重寫minimumLayoutSize方法和preferredLayoutSize方法,不過帖子上的代碼有點小問題,後來我仔細研究代碼和源碼,進行了修正,最後實現了想要的效果,下面把正確的代碼貼出來,供有此類需求的人使用
- package com.xxxx.swing.layout;
- import java.awt.Component;
- import java.awt.Container;
- import java.awt.Dimension;
- import java.awt.FlowLayout;
- import java.awt.Insets;
- public class ModifiedFlowLayout extends FlowLayout {
- public ModifiedFlowLayout() {
- super();
- }
- public ModifiedFlowLayout(int align) {
- super(align);
- }
- public ModifiedFlowLayout(int align, int hgap, int vgap) {
- super(align, hgap, vgap);
- }
- public Dimension minimumLayoutSize(Container target) {
- return computeSize(target, true);
- }
- public Dimension preferredLayoutSize(Container target) {
- return computeSize(target, false);
- }
- private Dimension computeSize(Container target, boolean minimum) {
- synchronized (target.getTreeLock()) {
- int hgap = getHgap();
- int vgap = getVgap();
- int w = target.getWidth();
- if (w == 0) {
- w = Integer.MAX_VALUE;
- }
- Insets insets = target.getInsets();
- if (insets == null) {
- insets = new Insets(0, 0, 0, 0);
- }
- int reqdWidth = 0;
- int maxwidth = w - (insets.left + insets.right + hgap * 2);
- int n = target.getComponentCount();
- int x = 0;
- int y = insets.top;
- int rowHeight = 0;
- for (int i = 0; i < n; i++) {
- Component c = target.getComponent(i);
- if (c.isVisible()) {
- Dimension d =
- minimum ? c.getMinimumSize() : c.getPreferredSize();
- if ((x == 0) || ((x + d.width) <= maxwidth)) {
- if (x > 0) {
- x += hgap;
- }
- x += d.width;
- rowHeight = Math.max(rowHeight, d.height);
- } else {
- x = d.width;
- y += vgap + rowHeight;
- rowHeight = d.height;
- }
- reqdWidth = Math.max(reqdWidth, x);
- }
- }
- y += rowHeight;
- return new Dimension(reqdWidth + insets.left + insets.right, y);
- }
- }
- }
最終的效果(不想截圖了,從網上找了個類似的效果圖片貼上來吧):