
。

关于ComponentListener和NullLayout的SSCCE
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JRadioButton;
import javax.swing.UIManager;
//http://stackoverflow.com/questions/14560680/jprogressbar-low-values-will-not-be-displayed
public class ProgressSample {
private JFrame frame = new JFrame("GlassPane instead of JLayer");
private JLabel label;
private GridBagConstraints gbc = new GridBagConstraints();
private JProgressBar progressSeven;
public ProgressSample() {
frame.setLayout(new FlowLayout());
frame.add(new JButton("test"));
frame.add(new JCheckBox("test"));
frame.add(new JRadioButton("test"));
// Nothing is displayed if value is lover that 6
JProgressBar progressSix = new JProgressBar(0, 100);
progressSix.setValue(2);
frame.add(progressSix);
// but this works value is higher that 6
progressSeven = new JProgressBar(0, 100);
progressSeven.addComponentListener(new ComponentAdapter() {
@Override
public void componentMoved(ComponentEvent e) {
label.setBounds(
(int) progressSeven.getBounds().getX(),
(int) progressSeven.getBounds().getY(),
progressSeven.getPreferredSize().width,
label.getPreferredSize().height);
}
});
progressSeven.setValue(7);
frame.add(progressSeven);
label = new JLabel();
label.setText("<html>Blablabla, Blablablabla<br>"
+ "Blablabla, Blablablabla<br>"
+ "Blablabla, Blablablabla</html>");
label.setPreferredSize(new Dimension(
progressSeven.getPreferredSize().width,
label.getPreferredSize().height));
Container glassPane = (Container) frame.getRootPane().getGlassPane();
glassPane.setVisible(true);
glassPane.setLayout(null);
glassPane.add(label, gbc);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
ProgressSample dialogTest = new ProgressSample();
}
}发布于 2013-08-21 13:51:36
如何在不使用JLabel或其他侦听器的情况下将GlassPane中的ComponentListener插入到JProgressBar中的相关浮动坐标
我的想法是用OverlayLayout将两个组件包装在容器中,并使用AlignementX/AlignementY作为相对坐标“播放”。然后将包装容器放到原始层次结构中。(见下面我的SSCCE )
标准LayoutManagers中是否有可以通知其内部状态的LayoutManagers通知程序,并且可以用于重写,而不是使用ComponentListener和NullLayout
在LayoutManager API中没有这样的约定,因此您不能安全地依赖任何这样的机制。此外,您将面临标准LayoutManager的问题,因为它们将在布局中考虑到您的额外JLabel。
假设您使用FlowLayout并放置了1个组件,然后是额外的JLabel,然后是另一个组件。当您移动额外的JLabel时,最后一个组件将“远离”第一个组件,您将看到这两个组件之间的差距。
如果最后一个问题不是问题,您可以简单地扩展FlowLayout (或任何其他LayoutManager),覆盖layoutContainer并将额外的JLabel放置在任何您想要的位置。
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JRadioButton;
import javax.swing.OverlayLayout;
import javax.swing.UIManager;
//http://stackoverflow.com/questions/14560680/jprogressbar-low-values-will-not-be-displayed
public class ProgressSample {
private JFrame frame = new JFrame("GlassPane instead of JLayer");
private JLabel label;
private GridBagConstraints gbc = new GridBagConstraints();
private JProgressBar progressSeven;
public ProgressSample() {
frame.setLayout(new FlowLayout());
frame.add(new JButton("test"));
frame.add(new JCheckBox("test"));
frame.add(new JRadioButton("test"));
// Nothing is displayed if value is lover that 6
JProgressBar progressSix = new JProgressBar(0, 100);
progressSix.setValue(2);
frame.add(progressSix);
JPanel wrappingPanel = new JPanel();
OverlayLayout mgr = new OverlayLayout(wrappingPanel);
wrappingPanel.setLayout(mgr);
progressSeven = new JProgressBar(0, 100);
progressSeven.setAlignmentX(0.0f);
progressSeven.setAlignmentY(0.0f);
frame.add(wrappingPanel);
label = new JLabel();
label.setText("<html>Blablabla, Blablablabla<br>" + "Blablabla, Blablablabla<br>" + "Blablabla, Blablablabla</html>");
label.setAlignmentX(0.0f);
label.setAlignmentY(0.0f);
wrappingPanel.add(label);
wrappingPanel.add(progressSeven);
Container glassPane = (Container) frame.getRootPane().getGlassPane();
glassPane.setVisible(true);
glassPane.setLayout(new FlowLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
ProgressSample dialogTest = new ProgressSample();
}
}https://stackoverflow.com/questions/18356000
复制相似问题