好的,我有一个Jpanel,使用叠加布局在下图中显示为白色。它拥有一个ScrollPane,它包含一个图像(“No Image Available”)和一个JButton(“Comment”)。
我想将此按钮放在JPanel的右下角。我尝试了多种布局方法,似乎无法让它工作。按钮最多移动大约3/4的东南方向,我不知道为什么。
非常感谢任何帮助..
答案 0 :(得分:3)
使用不同的布局管理器有很多可能的解决方案。我不知道OverlayLayout,但我喜欢WindowBuilder Pro(免费):https://developers.google.com/java-dev-tools/wbpro/以获得有关Swing设计的帮助。
使用它,我写了一个问题的SpringLayout实现(如果没有GUI构建器,SpringLayout似乎很难处理)。
JPanel panel = new JPanel();
SpringLayout sl_panel = new SpringLayout();
panel.setLayout(sl_panel);
JButton button = new JButton("Comments");
sl_panel.putConstraint(SpringLayout.SOUTH, button, 0, SpringLayout.SOUTH, panel);
sl_panel.putConstraint(SpringLayout.EAST, button, 0, SpringLayout.EAST, panel);
panel.add(button);
JScrollPane scrollPane = new JScrollPane();
sl_panel.putConstraint(SpringLayout.NORTH, scrollPane, 5, SpringLayout.NORTH, panel);
sl_panel.putConstraint(SpringLayout.WEST, scrollPane, 3, SpringLayout.WEST, panel);
sl_panel.putConstraint(SpringLayout.SOUTH, scrollPane, 3, SpringLayout.SOUTH, panel);
sl_panel.putConstraint(SpringLayout.EAST, scrollPane, 3, SpringLayout.EAST, panel);
panel.add(scrollPane);
JLabel lblNewLabel = new JLabel();
lblNewLabel.setIcon(new ImageIcon(foo.class.getResource("sSdA3.png")));
scrollPane.setViewportView(lblNewLabel);
这是运行代码的图片:
您可以看到按钮(我的,而不是您的图片......)浮动在底部的滚动窗格上方。我们可以调整上面的边距,这样按钮不会浮动在滚动条的顶部,但这只是为了显示它在z轴上的位置。
答案 1 :(得分:3)
在内容窗格的JPanel
位置添加带有图片的第一个CENTER
,然后将您的JPanel的布局设置为FlowLayout.RIGHT
并立即将JButton
添加到其中将此JPanel
添加到内容窗格的PAGE_END
的{{1}}位置。看一下这个例子
BorderLayout
这是输出:
答案 2 :(得分:3)
您提到使用OverlayLayout
;你想按钮实际上与图像重叠吗?
如果这对您不重要,请使用其他一个好的建议,因为它们更简单。但是如果你真的希望按钮与图像重叠,这里有一个解决方案:使用JLayeredPane
将两个JPanel
分层,然后按下按钮和图像。不幸的是,JLayeredPane
没有布局管理器,因此每当JPanel
调整大小时,都需要添加一个组件监听器来调整JLayeredPane
的大小。
这是一个SSCCE:
public class SSCCE {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
contentPane.setLayout(new BorderLayout());
final JLayeredPane layeredPane = new JLayeredPane();
contentPane.add(layeredPane,BorderLayout.CENTER);
final JPanel btnPane = new JPanel(new GridBagLayout());
btnPane.setOpaque(false);
JButton btn = new JButton("Comment");
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.anchor = GridBagConstraints.SOUTHEAST;
btnPane.add(btn,gbc);
final JPanel lblPane = new JPanel(new GridBagLayout());
lblPane.setBackground(Color.CYAN);
JLabel lbl = new JLabel("No Image Available");
gbc = new GridBagConstraints();
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.anchor = GridBagConstraints.CENTER;
lblPane.add(lbl,gbc);
layeredPane.add(btnPane,0);
layeredPane.add(lblPane,1);
layeredPane.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
lblPane.setBounds(0, 0, layeredPane.getWidth(), layeredPane.getHeight());
btnPane.setBounds(0, 0, layeredPane.getWidth(), layeredPane.getHeight());
}
});
frame.setSize(300,200);
frame.setVisible(true);
}
}
答案 3 :(得分:1)
我建议您使用GridBagLayout
而不是默认布局。使用GridBagLayout可以控制所有内容
这是一个帮助您的链接:how to use GridBagLayout
答案 4 :(得分:1)
我会说JPanel
BorderLayout
,EAST
位置添加了按钮,并将该面板放在主容器中(带BorderLayout
)at SOUTH
职位。
所以你得到:
-------------
| |
| |
| Image |
| |
|-----------|
|______Button
答案 5 :(得分:1)
检查SpringLayout。它允许您将元素定位到距组件的NORTH,WEST,EAST或SOUTH一定距离。您的代码如下所示:
SpringLayout layout = new SpringLayout();
setLayout(layout);
...
add(_button);
...
layout.putConstraint(SpringLayout.EAST, _button, -20, SpringLayout.EAST, this);
layout.putConstraint(SpringLayout.SOUTH, _button, -20, SpringLayout.SOUTH, this);