如何实现一个根据宽度显示/隐藏内容的JPanel?

时间:2013-03-26 18:12:03

标签: java swing layout miglayout

我正在尝试实现一个根据可用大小显示更多或更少信息的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:​​我在想...如果我将最小宽度设置为counter1 + label1,将最大尺寸设置为counter2 + label2然后侦听调整大小操作并将首选大小更改为无论是最小还是最大。这种机制可以起作用吗?

2 个答案:

答案 0 :(得分: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);
}

我无法让两个主要列平均调整大小;我必须通过在组件而不是列上设置宽度来实现。我不确定为什么会这样。

答案 1 :(得分:0)

我使用LayoutCallback实现了一个自动隐藏机制,根据面板的宽度切换组件的可见性。

以下是一个例子:

    - (void) showAlert {

    UIAlertController *alert = [UIAlertController alertController WithTitle:@"ALERT" message:@"" preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {

        switch (self.number) {
            case 0:
            self.number = 1;                
            [self secondAlert]; // other alert function
                break;
            case 1:
            [self thirdAlert];
            default:
            break;
            }
    }];
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"CANCEL" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {

            }];

    [alert addAction:okAction];
    [alert addAction:cancelAction];

            [self presentViewController:alert animated:YES completion:nil];

当面板宽度缩小到300像素以下时,l​​abel1被隐藏;当宽度小于200像素时,label2会消失。