我试图将cardlayout函数与null布局结合起来。 但是,当我尝试运行该程序时,它不起作用。按钮没有出现在我告诉他们的边界上。我做错了什么,或者使用它们的整个概念都错了吗?
public class CardLayoutTest extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel cardPanel, jp1, jp2, buttonPanel;
private JLabel jl1, jl2;
private JButton btn1, btn2;
private CardLayout cardLayout = new CardLayout();
public CardLayoutTest() {
setTitle("Test med CardLayout");
setSize(400, 300);
Insets insets = getInsets();
cardPanel = new JPanel();
buttonPanel = new JPanel();
cardPanel.setLayout(cardLayout);
jp1 = new JPanel();
jp2 = new JPanel();
jl1 = new JLabel("Card 1");
jl2 = new JLabel("Card 2");
jp1.add(jl1);
jp2.add(jl2);
cardPanel.add(jp1, "1");
cardPanel.add(jp2, "2");
btn1 = new JButton("Show Card 1");
btn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cardLayout.show(cardPanel, "1");
}
});
btn2 = new JButton("Show Card 2");
btn2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cardLayout.show(cardPanel, "2");
}
});
buttonPanel.add(btn1);
buttonPanel.add(btn2);
add(cardPanel, BorderLayout.NORTH);
add(buttonPanel, null);
Dimension size1 = btn1.getPreferredSize();
btn1.setBounds(100 + insets.left, 100 + insets.top,
size1.width, size1.height);
Dimension size = btn2.getPreferredSize();
btn2.setBounds(210 + insets.left, 130 + insets.top,
size.width, size.height);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
CardLayoutTest frame = new CardLayoutTest();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
答案 0 :(得分:3)
我做错了什么
是的,假设null
布局可以帮助您(但不了解null
布局是什么以及您需要从布局管理API接管的工作)
或使用它们的整个概念都错了吗?
简而言之,是的。 99.99%的时间你认为你需要一个null
布局,你不会,甚至在那个0.01%的时间内,你可能"你可能不会
那么,答案是什么?令人惊讶的是,使用适当的布局管理器并且不再担心像素完美"布局,它们是一种幻觉。现代计算机系统运行在一系列硬件和软件上,这些系统会改变UI的各个方面,这将改变组件交互或调整大小的方式。
虽然您可能只考虑在一个操作系统上运行此操作,但即使这样,硬件和软件驱动程序和操作设置也会改变字体,字体指标和DPI的大小,所有这些都会影响组件的空间量需要正确呈现。
相反,请关注UI的工作流程和可用性,以最大化用户体验。
所以,根据我对您的问题的(有限)理解,我在GridBagLayout
上使用了buttonPanel
而不是"模仿"你的预期结果。
buttonPanel = new JPanel(new GridBagLayout());
//...
add(buttonPanel, BorderLayout.SOUTH);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(100, 0, 0, 0);
buttonPanel.add(btn1, gbc);
gbc.insets = new Insets(0, 0, 0, 0);
gbc.gridx++;
gbc.gridy++;
buttonPanel.add(btn2, gbc);
布局经理可能有点难以开始,但它们是非常强大的工具。我使用所有内置布局管理器,一个第三方布局和我为解决特定问题而构建的几个自定义布局管理器,度过了我的整个职业生涯。我从来没有觉得有必要回到null
布局,我发现它们有限制,它们需要大量的时间和工作来维持并且通常是懒惰的