好的,我有一个使用覆盖布局在下图中显示为白色的 Jpanel。它包含一个 ScrollPane,其中包含一个图像(“No Image Available”)和一个 JButton(“Comment”)。
我想将此按钮放置在 JPanel 的右下角。我尝试了多种布局方法,但似乎无法使其正常工作。按钮最多向东南方向移动大约 3/4,我不知道为什么。
任何帮助是极大的赞赏..
您提到使用OverlayLayout
; 你想让按钮实际重叠图像吗?
如果这对您不重要,请使用其他好的建议之一,因为它们要简单得多。但是如果你真的希望按钮与图像重叠,这里有一个解决方案:使用 aJLayeredPane
到 layer two JPanel
s,依次布局按钮和图像。不幸的是,JLayeredPane
它没有布局管理器,因此有必要添加一个组件侦听器来调整JPanel
s 的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);
}
}
使用不同的布局管理器有很多可能的解决方案。我不知道 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 轴上的位置。
在内容窗格的位置添加第一个JPanel
带有图像的图像,CENTER
只需将 JPanel 的布局设置为FlowLayout.RIGHT
并将您的添加JButton
到其中,现在将其添加JPanel
到内容窗格的PAGE_END
位置BorderLayout
。看看这个例子
import java.awt.*;
import java.awt.event.*;
import javax.imageio.ImageIO;
import javax.swing.*;
public class ApplicationCloseExample
{
private Image image;
private static final String HTML =
"<html>" +
"<style type'text/css'>" +
"body, html { padding: 0px; margin: 0px; }" +
"</style>" +
"<body>" +
"<img src='http://pscode.org/media/starzoom-thumb.gif'" +
" width=320 height=240>" +
"";
private void displayGUI()
{
final JFrame frame = new JFrame("Application Close Example");
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
int result = JOptionPane.showConfirmDialog(
frame, "Do you want to Exit ?"
, "Exit Confirmation : ", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
else if (result == JOptionPane.NO_OPTION)
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
});
JPanel contentPane = new JPanel();
contentPane.setOpaque(true);
JLabel label = new JLabel(HTML);
contentPane.add(label);
JPanel bottomPanel = new JPanel();
bottomPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 5, 5));
JButton button = new JButton("Comment");
bottomPanel.add(button);
frame.getContentPane().add(contentPane, BorderLayout.CENTER);
frame.getContentPane().add(bottomPanel, BorderLayout.PAGE_END);
frame.pack();
frame.setVisible(true);
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new ApplicationCloseExample().displayGUI();
}
});
}
}
这是输出:
我会建议您使用GridBagLayout
而不是默认布局。使用 GridBagLayout,您可以控制一切。
这是一个可以帮助您的链接:如何使用 GridBagLayout
我会说 aJPanel
和 a BorderLayout
,在该EAST
位置添加按钮,然后将该面板放在主容器中(带有 a BorderLayout
)的SOUTH
位置。
所以你得到:
-------------
| |
| |
| Image |
| |
|-----------|
|______Button
检查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);