我正在尝试使用Java在Eclipse中设置背景图像,我认为我已经完成了大部分工作。
我正在尝试制作2D游戏,并且我想在我的menuJFrame
添加背景图片,您将在下面看到。
我已经有了这个代码:
这是我的主要课程JFrames
:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class JFrames extends JPanel implements ActionListener {
JFrame menuJFrame,howToPlayJFrame, level1JFrame;
JPanel menuJPanel,howToPlayJPanel;
JButton howToPlayButton,backToMainMenuButton,startGameButton, quitProgramButton;
JLabel howToPlayLabel;
public static void main(String [] args){
JFrames jframes = new JFrames();
}
public JFrames(){
//menuJFrame
menuJFrame = new JFrame("SquareRun/Menu");
menuJFrame.setVisible(true);
menuJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
menuJFrame.setSize(800, 600);
//menuJPanel
menuJPanel = new JPanel();
menuJFrame.add(menuJPanel);
howToPlayButton = new JButton("How To Play");
menuJPanel.add(howToPlayButton);
howToPlayButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == howToPlayButton){
howToPlayJFrame.setVisible(true);
}
}});
startGameButton = new JButton("Start Game");
menuJPanel.add(startGameButton);
startGameButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == startGameButton)
level1JFrame.setVisible(true);
menuJFrame.setVisible(false);
}});
quitProgramButton = new JButton("Quit Game");
menuJPanel.add(quitProgramButton);
quitProgramButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == quitProgramButton){
menuJFrame.dispose();
}
}});
//howToPlayJFrame
howToPlayJFrame = new JFrame("SquareRun/HowToPlay");
howToPlayJFrame.setVisible(false);
howToPlayJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
howToPlayJFrame.setSize(600, 100);
//howToPlayJPanel
howToPlayJPanel = new JPanel();
howToPlayJFrame.add(howToPlayJPanel);
howToPlayLabel = new JLabel("Use the arrow keys to move, Up= jump, Down= down, Right= right, Left= left");
howToPlayJPanel.add(howToPlayLabel);
backToMainMenuButton = new JButton("Close Window");
howToPlayJPanel.add(backToMainMenuButton);
backToMainMenuButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == backToMainMenuButton){
howToPlayJFrame.setVisible(false);
howToPlayJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}}});
//level1JFrame
level1JFrame = new JFrame("Level 1");
level1JFrame.setVisible(false);
level1JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
level1JFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
}
public void actionPerformed(ActionEvent e) {
}
public Object getCurrentLevel() {
return null;
}
}
这是我的背景课程:
import java.awt.Image;
import javax.swing.ImageIcon;
public class Background extends JFrames {
private JFrames game;
private Image image;
public Background(JFrames game){
this.game = game;
image = (new ImageIcon("Image001.png")).getImage();
}
}
答案 0 :(得分:1)
您可以使用此代码获取图像
image = (new ImageIcon(this.getClass().getResource("Image001.png"))).getImage();
假设带有图像的文件与此类位于同一文件夹中。
答案 1 :(得分:1)
不要创建以J
开头的类,这只会让人感到困惑,特别是当有JFrame
类时,你创建了一个名为JFrames
的类,它从{{1}延伸现在我只是困惑......
您遇到的第一个问题是,您实际上并未将JPanel
用于image
类内的任何内容......
您问题的基本解决方案是使用Background
作为后台组件,为其提供布局管理器并将组件添加到其中。
JLabel
然后您只需根据需要设置布局管理器并将组件添加到其中。
问题在于,调整组件大小时不会调整图像大小。为此,您需要提供一种方法来控制图像的绘制。
这将要求您从public class Background extends JLabel {
public Background() {
setIcon(new ImageIcon("Image001.png")));
// Don't forget to set the layout...
}
}
扩展Background
类,并覆盖它的JPanel
方法,并根据需要绘制图像。
查看Performing Custom Painting了解更多详情。
这将需要为图像提供某种缩放操作。虽然有许多方法可以在Java中扩展图像,但还是有许多问题需要注意。看看The Perils of Image.getScaledInstance()
这引发了一系列新问题,你想要缩放它们并保持纵横比吗?如果是这样,您是否希望将图像适合可用区域或填充它(因此它将始终覆盖可用空间)?
请查看Java: maintaining aspect ratio of JPanel background image了解详情。
我强烈建议您查看The Use of Multiple JFrames: Good or Bad Practice?和http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html,这样可以帮助您减少令人困惑的用户体验,恕我直言。
您还应该看一下Reading/Loading an Image作为paintComponent
的替代方案,因为它有能力读取更多文件格式,但是当它可以时也会抛出ImageIcon
读取图像,这对诊断缺失的图像问题非常有帮助。