java 使用 Swing 将背景图像添加到 JFrame
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16329706/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Adding a background image to a JFrame using Swing
提问by user2341499
Hello i have been following multiple guides on how to add a background image to a JFrame. However when run my program, the background turns out with only a bit of the background image showing in the bottom left and bottom sides.
您好,我一直在关注有关如何将背景图像添加到 JFrame 的多个指南。然而,当运行我的程序时,背景变成了只有一点背景图像显示在左下角和下侧。
Here is my current code:
这是我当前的代码:
private int width = 1280;
private int height = 720;
private String title = "Creation - " + Component.versionID + " Launcher";
private JPanel window = new JPanel();
private JFrame frame = new JFrame();
private JLabel name, version;
private JButton play, options, changelog, quit;
private Rectangle rPlay, rOptions, rChangelog, rQuit, rName, rVersion;
private int buttonWidth = 200;
private int buttonHeight = 80;
public Menu (Component component) {
frame.setTitle(title);
frame.setSize(new Dimension(width, height));
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.add(component);
frame.getContentPane().add(window);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setIconImage(new ImageIcon("res/icon.png").getImage());
setLayout(new BorderLayout());
JLabel background = new JLabel(new ImageIcon("res/background.png"));
frame.add(background);
background.setLayout(new FlowLayout());
window.setLayout(null);
drawButtons();
frame.repaint();
frame.pack();
}
private void drawButtons() {
name = new JLabel("Creation");
rName = new Rectangle((width/2) - (buttonWidth/2) + 60, 20, buttonWidth, buttonHeight);
name.setBounds(rName);
window.add(name);
play = new JButton("Play");
rPlay = new Rectangle((width/2) - (buttonWidth/2), 250, buttonWidth, buttonHeight);
play.setBounds(rPlay);
window.add(play);
options = new JButton("Options");
rOptions = new Rectangle((width/2) - (buttonWidth/2), 350, buttonWidth, buttonHeight);
options.setBounds(rOptions);
window.add(options);
changelog = new JButton("View change-log");
rChangelog = new Rectangle((width/2) - (buttonWidth/2), 450, buttonWidth, buttonHeight);
changelog.setBounds(rChangelog);
window.add(changelog);
quit = new JButton("Quit");
rQuit = new Rectangle((width/2) - (buttonWidth/2), 550, buttonWidth, buttonHeight);
quit.setBounds(rQuit);
window.add(quit);
play.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Component component = new Component();
frame.dispose();
component.start();
}
});
options.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
changelog.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
quit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
(As you can see) my JFrame size is 1280x720. This is the same size as the background image, so I don't see any issues. If anyone could help me edit my code or give me pointers, I am simply looking for the background image to display behind the buttons.
(如您所见)我的 JFrame 大小为 1280x720。这与背景图像的大小相同,所以我没有看到任何问题。如果有人可以帮助我编辑我的代码或给我指点,我只是在寻找显示在按钮后面的背景图像。
回答by Hovercraft Full Of Eels
- If your GUI will be the size of the image, then add the BufferedImage to the JLabel, and add the JLabelthe to the JFrame's contentPane, not some JPanel that doesn't display the image.
- Don't use null layout and
setBounds(...)
but instead use decent layout managers. While null layout seemseasier to newbies, that's usually just because you may be unfamiliar with how to use layout managers, and trust me, it is mucheasier to create and maintain GUI's that use well-behaved layout managers. - Give that JPanel/contentPane a decent layout since you'll be adding components to it.
- 如果您的 GUI 将是图像的大小,则将 BufferedImage 添加到 JLabel,并将JLabel添加到 JFrame 的 contentPane,而不是某些不显示图像的 JPanel。
- 不要使用空布局,
setBounds(...)
而是使用合适的布局管理器。虽然空布局对新手来说似乎更容易,但这通常只是因为您可能不熟悉如何使用布局管理器,相信我,创建和维护使用表现良好的布局管理器的 GUI要容易得多。 - 给 JPanel/contentPane 一个合适的布局,因为你将向它添加组件。
回答by Anoop
String filename = "demo//6.jpg";
BufferedImage image = ImageIO.read(new File(filename));
//Create Image Label
JLabel label = new JLabel(new ImageIcon(image));
label.setBounds(0, 0, image.getWidth(), image.getHeight());
lpane.setLayout(null);
lpane.setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
lpane.add(label, new Integer(JLayeredPane.DEFAULT_LAYER-1));
ImageIcon ic=new ImageIcon("demo//12.jpg");
but.setIcon(ic);
回答by Mulayam
class MyFrame {
类我的框架{
public static void main(String arr[])
{
JPanel panel=new JPanel()
{
@Override
protected void paintComponent(Graphics g)
{
try
{
BufferedImage image = ImageIO.read(new File("C://Users//MulayamYadav//Desktop//1.jpg"));
Image image1=image.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH);
g.drawImage(image1, 0, 0, null);
}catch(Exception ex)
{
System.out.println(ex);
}
}
};
JFrame frame=new JFrame();
panel.setLayout(new FlowLayout());
panel.add(new JButton("Button1"));
panel.add(new JButton("Button2"));
add(panel);
frame.setVisible(true);
}
}