我试图想出最好的布局管理器来实现下图。我知道绝对定位是我习惯的,但我无法使用它获取背景图像。GridBagLayout
非常好,但是当我尝试时,我会为每个网格获得一个单独的图像,这非常困难。
有谁知道一个简单的方法,或者简单的代码来实现以下目标?
我试图想出最好的布局管理器来实现下图。我知道绝对定位是我习惯的,但我无法使用它获取背景图像。GridBagLayout
非常好,但是当我尝试时,我会为每个网格获得一个单独的图像,这非常困难。
有谁知道一个简单的方法,或者简单的代码来实现以下目标?
有几种方法可以做到这一点。目前我能想到的有这些:
JComponent
。paintComponent(Graphics g)
方法以绘制要显示的图像。JFrame
子类。一些示例代码:
class ImagePanel extends JComponent {
private Image image;
public ImagePanel(Image image) {
this.image = image;
}
@Override
protected void paintComponent(Graphics g) {
g.drawImage(image, 0, 0, null);
}
}
// elsewhere
BufferedImage myImage = ImageIO.read(...);
JFrame myJFrame = new JFrame("Image pane");
myJFrame.setContentPane(new ImagePanel(myImage));
JFrame
请注意,如果您想要的话,此代码不会处理重新调整图像大小以适应.
您可以通过多种方式实现这一目标。
最简单的可能是只使用已经可用的东西......
如果您不需要在运行时缩放背景(即您可以摆脱不可调整大小的窗口),只需使用 aJLabel
作为主要容器就可以让您的生活变得更加轻松。
public class LabelBackground {
public static void main(String[] args) {
new LabelBackground();
}
public LabelBackground() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new LoginPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class LoginPane extends JLabel {
public LoginPane() {
try {
setIcon(new ImageIcon(ImageIO.read(getClass().getResource("/background.jpg"))));
} catch (IOException ex) {
ex.printStackTrace();
}
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.EAST;
gbc.insets = new Insets(2, 2, 2, 2);
gbc.gridx = 0;
gbc.gridy = 0;
JLabel nameLabel = new JLabel("Name: ");
nameLabel.setForeground(Color.WHITE);
JLabel passwordLabel = new JLabel("Password: ");
passwordLabel.setForeground(Color.WHITE);
add(nameLabel, gbc);
gbc.gridy++;
add(passwordLabel, gbc);
gbc.anchor = GridBagConstraints.WEST;
gbc.gridx++;
gbc.gridy = 0;
add(new JTextField(20), gbc);
gbc.gridy++;
add(new JTextField(20), gbc);
gbc.gridy++;
gbc.insets = new Insets(10, 2, 2, 2);
gbc.anchor = GridBagConstraints.EAST;
add(new JButton("Submit"), gbc);
}
}
}
更新了左对齐示例
在构造函数的最后,添加...
JPanel filler = new JPanel();
filler.setOpaque(false);
gbc.gridx++;
gbc.weightx = 1;
add(filler, gbc);
您可能想查看如何使用 GridBagLayout了解更多详细信息