2013-03-26 58 views
2

我想實現顯示取決於可用大小或多或少的信息一個JPanel。如何實現一個顯示/隱藏內容取決於其寬度的JPanel?

基本上,這個想法是有一個默認的內容是這樣的:

enter image description here

時的空間減小,可以縮小到這一點:

enter image description here

我的代碼是這樣的:

import net.miginfocom.swing.MigLayout; 
import javax.swing.*; 

class PanelDemo extends JPanel { 
private final JLabel title = new JLabel(); 

private final JLabel counter1 = new JLabel("00"); 
private final JLabel counter1Label = new JLabel(); 

private final JLabel counter2 = new JLabel("00"); 
private final JLabel counter2Label = new JLabel(); 

/** 
* Instantiates a new obs app cadre message bloc panel. 
*/ 
public PanelDemo() { 
    this.setOpaque(false); 
    initGUI(); 
} 

private final void initGUI() { 
    // 1°) 
    final MigLayout migLayout = new MigLayout(
      "fillx, hidemode 2, debug", 
      "[growprio 0][]" //define 4 columns 
    ); 

    setLayout(migLayout); 

    // 2°) 
    // 
    add(title, "spanx"); 
    add(counter1, "newline"); 
    add(counter1Label); 
    add(counter2); 
    add(counter2Label); 
} 

public static void main(String[] args) { 
    final JFrame jFrame = new JFrame("test 4"); 
    jFrame.getContentPane().setLayout(new MigLayout("fillx, debug")); 
    final PanelDemo item1 = new PanelDemo(); 
    item1.title.setText("Element 1"); 
    item1.counter1Label.setText("First lbl"); 
    item1.counter2Label.setText("Second lbl"); 
    jFrame.getContentPane().add(item1, "growx, gpx 110"); 


    final PanelDemo item2 = new PanelDemo(); 
    item2.title.setText("Element 2"); 
    item2.counter1Label.setText("First lbl"); 
    item2.counter2Label.setText("Second lbl"); 
    jFrame.getContentPane().add(item2, "growx, gpx 100"); 

    jFrame.pack(); 
    jFrame.setVisible(true); 
} } 

我試圖添加一個ComponentListener並覆蓋componentResized()來查找何時可以顯示/隱藏我的次標籤,但我沒有成功。

有誰知道如何實現順利與MigLayout增長優先這樣的行爲?

UPDATE1:我在想......如果我最小寬度設置爲計數器1 + LABEL1,最大尺寸計數器2 +標籤2,然後聽來調整操作和更改首選大小要麼最小或其最大值。這種機制會起作用嗎?

回答

0

如何:

public static JPanel panel(String name) { 
    JPanel panel = new JPanel(new MigLayout("insets 0, wrap 4, fillx, debug", "[][][shrink 200][shrink 200, grow 200]")); 
    panel.add(new JLabel(name), "spanx 4"); 
    panel.add(new JLabel("00")); 
    panel.add(new JLabel("First lbl")); 
    panel.add(new JLabel("01")); 
    panel.add(new JLabel("Second lbl")); 
    return panel; 
} 

public static void main(String[] args) { 
    JPanel panel = new JPanel(new MigLayout("insets 10, gap 10, fillx, debug")); 
    panel.add(panel("Element 1"), "w (50% - 15)!"); 
    panel.add(panel("Element 2"), "w (50% - 15)!"); 

    JFrame frame = new JFrame(); 
    frame.setContentPane(panel); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
} 

我有麻煩的兩個主要列同樣調整;我必須通過在組件上設置寬度而不是在列上設置寬度。我不確定這是爲什麼。

+0

行爲是不完全的一個期待。我應該更清楚。當可用於第二標籤(第二計數器+第二說明)的空間不再可用,我希望整個組件通過移除/調用setVisible(假)的次級標記和具有其優選的尺寸減小,以反映新的佈局,以改變其狀態。稍後,當父容器有更多可用空間時,我的面板應該返回到其初始完整狀態。我的想法是否使敏感? – Pigelvy 2013-03-27 07:36:43

0

予實現的自動隱藏機構與LayoutCallback切換根據面板的寬度的部件的可見性。

下面是一個例子:

MigLayout layout = new MigLayout("fill"); 
JPanel panel = new JPanel(layout); 

JLabel label1 = new JLabel("Label 1"); 
label1.putClientProperty("autohide.width", 300); 

JLabel label2 = new JLabel("Label 2"); 
label2.putClientProperty("autohide.width", 200); 

panel.add(label1, "grow"); 
panel.add(label2, "grow");     

layout.addLayoutCallback(new LayoutCallback() { 
    @Override 
    public void correctBounds(ComponentWrapper wrapper) { 
     JComponent component = (JComponent) wrapper.getComponent(); 

     Number width = (Number) component.getClientProperty("autohide.width"); 
     if (width != null) { 
      if (component.isVisible() && wrapper.getParent().getWidth() < width.intValue()) { 
       component.setVisible(false); 
      } else if (!component.isVisible() && wrapper.getParent().getWidth() > width.intValue()) { 
       component.setVisible(true); 
      } 
     } 
    } 
}); 

這裏當面板的寬度收縮低於300個像素,並且當寬度小於200個像素LABEL2消失label1的被隱藏。

相關問題