java - 显示带有扩展 JFrame 的图像
问题描述
我为我的图块编写了一些代码,在其中绘制了 2 个对象,但是我无法在图块中加载背景,因为它扩展了 JFrame。我究竟做错了什么?我使用缓冲图像来读取图片,使其适合任何屏幕尺寸,将其设置为 JLabel,但仍然无法正常工作。Square1 和障碍物是导入的矩形图形,一个作为玩家移动,另一个作为障碍物。
public class BasicTwoPlayer extends JFrame implements Runnable {
static Square1 p1 = new Square1();
static Square2 p2 = new Square2();
static obstacle o1 = new obstacle();
static Thread p1t;
static Thread p2t;
static Thread o1t;
KeyADAPT a = new KeyADAPT();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
final int widthScreen = screenSize.width;
final int heightScreen = screenSize.height;
public BasicTwoPlayer() {
try {
BufferedImage backgroundImage = ImageIO.read(new File("P://My Pictures//background1.jpg"));
JLabel background = new JLabel(new ImageIcon(backgroundImage));
Image scaleBackground = backgroundImage.getScaledInstance(widthScreen, heightScreen, Image.SCALE_SMOOTH);
ImageIcon imageIcon = new ImageIcon(scaleBackground);
setContentPane(new JLabel(imageIcon));
addKeyListener(a);
setSize(new Dimension(widthScreen, heightScreen));
setUndecorated(true);
setBackground(Color.WHITE);
setLayout(null);
setLocationRelativeTo(null);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
p1t = new Thread(p1);
p2t = new Thread(p2);
o1t = new Thread(o1);
p1t.start();
p2t.start();
} catch (IOException ex) {
Logger.getLogger(BasicTwoPlayer.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void paint(Graphics g) {
background.paint(g);
}
public void draw(Graphics g) {
p1.draw(g);
o1.draw(g);
repaint();
}
public static void main(String[] args) {
BasicTwoPlayer sf = new BasicTwoPlayer();
Thread mt = new Thread(sf);
mt.start();
t1.start();
}
解决方案
我只想像其他人一样得到答案:/
你会惊讶于我多么愿意学习如何回答我自己的问题;)
您将需要了解:
不难理解:
“如何添加背景图像” ...
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setContentPane(new BackgroundPane());
frame.add(new OverlayPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class OverlayPane extends JPanel {
public OverlayPane() {
setOpaque(false);
setLayout(new GridBagLayout());
JLabel label = new JLabel("You'd be suprised who far a little knowledge will take you");
label.setForeground(Color.WHITE);
add(label);
}
}
public class BackgroundPane extends JPanel {
private BufferedImage backgroundImage;
public BackgroundPane() {
setLayout(new BorderLayout());
try {
backgroundImage = ImageIO.read(BackgroundPane.class.getResource("background.jpg"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public Dimension getPreferredSize() {
return backgroundImage == null ? new Dimension(200, 200) : new Dimension(backgroundImage.getWidth(), backgroundImage.getHeight());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (backgroundImage == null) { return; }
int x = (getWidth() - backgroundImage.getWidth()) / 2;
int y = (getHeight() - backgroundImage.getHeight()) / 2;
Graphics2D g2d = (Graphics2D) g.create();
g2d.drawImage(backgroundImage, x, y, this);
g2d.dispose();
}
}
}
您将想要了解:
根据您的方向以及您迄今为止的所有其他问题。它们将帮助您避免常见的陷阱。
我不怀疑你在掌握这些概念时会遇到问题,我鼓励你玩一玩,如果和何时,特别是发布一个问题。
推荐阅读
- android - MediaPlayer,Android:一段时间后,即使事件没有发生,事件处理程序也会自动触发
- javascript - 用 Javascript 让动物在屏幕上运行
- node.js - MongoDB Mongoose:使用“_id”属性查询子文档不起作用
- excel - 将数据从一个工作表复制到另一个工作表不起作用
- ruby-on-rails-4 - 安装 mysql2 时出错:错误:无法构建 gem 原生扩展
- c# - Asp.net 托管了多个 blazor 应用程序
- python - 如何使用 Python 和 Matplotlib 对多边形(由数组定义)进行动画处理
- javascript - 加载时调用上传处理程序的 Jquery 文件上传
- xml - windows命令在xml文件的父标签中查找子标签的组合
- java - android的webview显示空白屏幕