如何在GridBagLayout上放置背景图像

时间:2013-06-26 21:37:24

标签: java image swing jpanel gridbaglayout

我第一次尝试与布局管理员合作,他们只是在踢我。我正在尝试制作背景图像,然后使用GridBagLayout将按钮放在顶部,如果有更好的布局管理器请告诉我。至于尝试学习如何使用布局管理器,其非常困难和任何学习参考也将非常感激。 This is whats it looks like currently 这就是目前的情况, 我可以让框架显示完整的图像,但是当我使用gridlayout管理器时,它会这样做

public void addComponentsToPane(Container pane){
    BackgroundImage image = new BackgroundImage();
    JButton button1, button2, button3, button4, button5;
    pane.setLayout(new GridBagLayout());

    GridBagConstraints c = new GridBagConstraints();

    if(shouldFill){
        c.fill = GridBagConstraints.NONE;
    }   
    button1 = new JButton("Button 1");
    if (shouldWeightX) {
    c.weightx = 0.5;
    }
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 1;
    c.gridy = 0;
    button1.setOpaque(false);
    pane.add(button1, c);


    button2 = new JButton("Button 2");
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 0.5;    
    c.gridx = 0;
    c.gridy = 0;
    button2.setOpaque(false);
    pane.add(button2, c);

    button3 = new JButton("Button 3");
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 0.5;
    c.gridx = 2;
    c.gridy = 0;
    button3.setOpaque(false);
    pane.add(button3, c);

    button4 = new JButton("Long-Named Button 4");
    c.fill = GridBagConstraints.HORIZONTAL;
    c.ipady = 40;      //make this component tall
    c.weightx = 0.0;
    c.gridwidth = 3;
    c.gridx = 0;
    c.gridy = 1;
    pane.add(button4, c);
    button5 = new JButton("button 1");
    c.fill = GridBagConstraints.HORIZONTAL;
    c.ipady = 0;       //reset to default
    c.weighty = 1.0;   //request any extra vertical space
    c.anchor = GridBagConstraints.PAGE_END; //bottom of space
    c.insets = new Insets(10,0,0,0);  //top padding
    c.gridx = 1;       //aligned with button 2
    c.gridwidth = 2;   //2 columns wide
    c.gridy = 2;       //third row
    pane.add(button5, c);
    c.ipadx = 800;
    c.ipady = 400;
    pane.add(image, c);

}

This is what i'm trying to get it to look like 这就是我想让它看起来像

2 个答案:

答案 0 :(得分:5)

这是一种方法:使用JLabel作为带图像的容器(这有点不寻常,但实际上效果很好):

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class TestBackgroundImage {

    private static final String BACKHGROUND_IMAGE_URL = "http://www.okyn.org/wp-content/uploads/2013/04/League_of_Legends.jpeg";

    protected void initUI() throws MalformedURLException {
        JFrame frame = new JFrame(TestBackgroundImage.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final ImageIcon backgroundImage = new ImageIcon(new URL(BACKHGROUND_IMAGE_URL));
        JLabel mainPanel = new JLabel(backgroundImage) {
            @Override
            public Dimension getPreferredSize() {
                Dimension size = super.getPreferredSize();
                Dimension lmPrefSize = getLayout().preferredLayoutSize(this);
                size.width = Math.max(size.width, lmPrefSize.width);
                size.height = Math.max(size.height, lmPrefSize.height);
                return size;
            }
        };
        mainPanel.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(10, 10, 10, 10);
        gbc.weightx = 1.0;
        gbc.anchor = GridBagConstraints.WEST;
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        for (int i = 0; i < 5; i++) {
            mainPanel.add(new JButton("Button " + (i + 1)), gbc);
        }
        // Let's put a filler bottom component that will push the rest to the top
        gbc.weighty = 1.0;
        mainPanel.add(Box.createGlue(), gbc);
        frame.add(mainPanel);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                try {
                    new TestBackgroundImage().initUI();
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }

}

结果:

enter image description here

  • GridBagLayout无法处理组件的分层(因此,如果您有重叠的gridx / gridy对,它将不会将其作为分层处理,我会认为输出是几乎没有确定。
  • 尽量避免使用gridx/gridy,因为它会使代码难以维护。在gridwidth/gridheight上玩相对值更容易维护。

答案 1 :(得分:4)

根据您的要求,查看Background Panel的几个解决方案:

  1. 使用JLabel以实际大小绘制图像。
  2. 使用BackgroundPanel允许缩放背景图像。