如何使组件在面板的某个区域内居中

时间:2014-04-10 00:49:26

标签: java swing button layout components

enter image description here

我想放置一些按钮,使它们居中,但是在面板的右侧(苍白的盒子所在的位置)。 当窗口重新调整大小时,背景会重新调整大小,因此我希望按钮在面板的该区域内保持居中。 背景分为两部分,左侧是徽标,右侧是苍白的框(我想放置按钮的位置)。  我需要四个按钮,使它们位于四个浅色框的顶部,并在窗口重新调整大小时保持在那里,因此所有位置/大小都需要相对于窗口的大小。 我怎么能这样做而不必在重新调整窗口时手动重新调整大小/重新定位按钮(正如我使用组件监听器完成背景)?我想过可能会使用盒子布局,但这只是在程序的中心。

(忽略左上角的按钮)

2 个答案:

答案 0 :(得分:1)

您可以嵌套面板。您可能需要考虑的一个选项是使用GridBagLayout(或标签)创建四个面板。使用一些简单的Photoshop来剪切其中一个苍白的盒子,并将其用作每个面板/标签的背景。然后,您可以在面板/标签的顶部添加每个按钮。这样您就可以确保无论框架的大小如何,按钮都将处于苍白图像中

以下是使用这些图像的示例

enter image description here enter image description here

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ButtonsWithBackground {

    public ButtonsWithBackground() {
        BufferedImage[] images = getImages();
        ImagePanel backgroundPanel = new ImagePanel(images[0]);
        backgroundPanel.setLayout(new GridLayout(1, 2, 0, 0));
        JPanel buttonsPanel = createButtonsPanel(images);
        JPanel leftPanel = new JPanel();
        leftPanel.setOpaque(false);

        backgroundPanel.add(leftPanel);
        backgroundPanel.add(buttonsPanel);

        JFrame frame = new JFrame();
        frame.setContentPane(backgroundPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JPanel createButtonsPanel(BufferedImage[] images) {
        JPanel panel = new JPanel(new GridLayout(4, 1));
        for (int i = 0; i < 4; i++) {
            ImagePanel buttonPanel = new ImagePanel(images[1]);
            buttonPanel.add(new JButton("Hey I'm a Button"));
            panel.add(buttonPanel);
        }
        return panel;
    }

    private BufferedImage[] getImages() {
        BufferedImage[] bi = new BufferedImage[2];
        try {
            BufferedImage bg = ImageIO.read(new URL("http://i.stack.imgur.com/YFfO4.png"));
            BufferedImage jbtbg = ImageIO.read(new URL("http://i.stack.imgur.com/DtO9U.png"));
            bi[0] = bg;
            bi[1] = jbtbg;
        } catch (IOException ex) {
            Logger.getLogger(ButtonsWithBackground.class.getName()).log(Level.SEVERE, null, ex);
        }
        return bi;
    }

    private class ImagePanel extends JPanel {
        private BufferedImage img;

        public ImagePanel(BufferedImage img) {
            this.img = img;
            setLayout(new GridBagLayout());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
        }
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(img.getWidth(), img.getHeight());
        }
    }

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

enter image description here

您可以调整窗口大小,按钮将保持不变。

答案 1 :(得分:0)

将按钮放在一个JPanel中:

Jpanel buttonHolder = new JPanel;
buttonHolder.add(button1);
buttonHolder.add(button2);
buttonHolder.add(button3);
buttonHolder.add(button4);

frame.add(buttonHolder, FlowLayout.RIGHT); //justify to the right side

通常,将所有按钮放在同一个面板中是一个好主意,这样如果您决定添加第五个按钮,那么在不破坏GUI其余部分的情况下这样做非常容易。正如peeskillet建议的那样,如果您需要GUI来处理调整大小,请使用GridBagLayout(请在提供的链接中查看fill