JButton定位问题

时间:2012-05-24 16:24:39

标签: java swing layout jpanel jbutton

好的,我有一个Jpanel,使用叠加布局在下图中显示为白色。它拥有一个ScrollPane,它包含一个图像(“No Image Available”)和一个JButton(“Comment”)。

enter image description here

我想将此按钮放在JPanel的右下角。我尝试了多种布局方法,似乎无法让它工作。按钮最多移动大约3/4的东南方向,我不知道为什么。

非常感谢任何帮助..

6 个答案:

答案 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);

这是运行代码的图片:

enter image description here

您可以看到按钮(我的,而不是您的图片......)浮动在底部的滚动窗格上方。我们可以调整上面的边距,这样按钮不会浮动在滚动条的顶部,但这只是为了显示它在z轴上的位置。

答案 1 :(得分:3)

在内容窗格的JPanel位置添加带有图片的第一个CENTER,然后将您的JPanel的布局设置为FlowLayout.RIGHT并立即将JButton添加到其中将此JPanel添加到内容窗格的PAGE_END的{​​{1}}位置。看一下这个例子

BorderLayout

这是输出:

RIGHT JBUTTON

答案 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 BorderLayoutEAST位置添加了按钮,并将该面板放在主容器中(带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);