我有一个 JPanel,包含另一个 JPanel,我想在上面放置一个 JButton,使用 SpringLayout。但是由于某种原因,没有绘制 JButton。但是,如果我使用绝对定位而不是布局管理器,则会绘制 JButton。如果我在设置 SpringLayout 的约束后打印出 JButton 的边界,我会得到宽度和高度为 0 的位置 (0, 0)。通过手动设置 JButton 的大小(调用 setSize())我得到JButton 以正确的大小绘制,但不在正确的位置。
到目前为止,这是我的代码的精简版本:
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SpringLayout;
public class Panel extends JPanel {
private JPanel innerPanel;
public Panel(){
innerPanel = new InnerPanel();
this.setLayout(null);
innerPanel.setBounds(30, 30, 100, 200);
this.add(innerPanel);
this.setOpaque(false);
}
public class InnerPanel extends JPanel {
private SpringLayout layout;
private JButton someButton;
public InnerPanel() {
layout = new SpringLayout();
this.setLayout(layout);
someButton = new JButton("X");
someButton.setPreferredSize(new Dimension(45, 25));
layout.putConstraint(SpringLayout.NORTH, someButton, +5, SpringLayout.NORTH, innerPanel);
layout.putConstraint(SpringLayout.EAST, someButton, -5, SpringLayout.EAST, innerPanel);
this.add(someButton);
this.setOpaque(false);
}
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.add(new Panel());
f.setSize(800, 600);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
SpringLayout 只是为了在 JPanel 上放置一个 JButton 可能看起来有点过于复杂,但我计划向 JPanel 添加更多组件,为此我需要 SpringLayout。
我正在使用 Eclipse(没有 Window Builder)并且我正在运行 OpenSuse,如果这很重要的话。