如何实现一个显示/隐藏内容取决于其宽度的JPanel?
我试图实现一个JPanel,根据可用的大小显示更多或更少的信息。
基本上,这个想法有一个像这样的默认内容:
当空间缩小时,这可以缩小到这个范围:
我的代码是这样的:
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,然后再听取调整大小操作并将首选大小更改为最小值或最大值,会怎么样? 这种机制会起作用吗?
这个怎么样:
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);
}
我无法让两个主要栏目平等调整大小, 我必须通过在组件上设置宽度而不是在列上设置宽度。 我不确定这是为什么。
我实现了一个带有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像素以下时,label1被隐藏,并且当宽度小于200像素时,label2消失。
链接地址: http://www.djcxy.com/p/49965.html上一篇: How to implement a JPanel that shows/hide content depending on its width?