我想放置一些按钮,使它们居中,但是在面板的右侧(苍白的盒子所在的位置)。 当窗口重新调整大小时,背景会重新调整大小,因此我希望按钮在面板的该区域内保持居中。 背景分为两部分,左侧是徽标,右侧是苍白的框(我想放置按钮的位置)。 我需要四个按钮,使它们位于四个浅色框的顶部,并在窗口重新调整大小时保持在那里,因此所有位置/大小都需要相对于窗口的大小。 我怎么能这样做而不必在重新调整窗口时手动重新调整大小/重新定位按钮(正如我使用组件监听器完成背景)?我想过可能会使用盒子布局,但这只是在程序的中心。
(忽略左上角的按钮)
答案 0 :(得分:1)
您可以嵌套面板。您可能需要考虑的一个选项是使用GridBagLayout
(或标签)创建四个面板。使用一些简单的Photoshop来剪切其中一个苍白的盒子,并将其用作每个面板/标签的背景。然后,您可以在面板/标签的顶部添加每个按钮。这样您就可以确保无论框架的大小如何,按钮都将处于苍白图像中
以下是使用这些图像的示例
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();
}
});
}
}
您可以调整窗口大小,按钮将保持不变。
答案 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
。