Java 图形图像的问题
我一直在搜寻过去的StackOverflow帖子,试图找出我的图像无法显示的原因 我知道Java 图形图像的问题,java,swing,graphics,drawimage,Java,Swing,Graphics,Drawimage,我一直在搜寻过去的StackOverflow帖子,试图找出我的图像无法显示的原因 我知道ImageIO很好,因为我可以在BufferedImage上运行getWidth(),它返回正确的宽度 这是我的Graphic课程,然后是我的主课。 (很抱歉,我的代码没用,我是新手。) 图形中的代码类: package blackjack; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; imp
ImageIO
很好,因为我可以在BufferedImage
上运行getWidth()
,它返回正确的宽度
这是我的Graphic
课程,然后是我的主课。
(很抱歉,我的代码没用,我是新手。)
图形中的代码
类:
package blackjack;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Graphic extends JPanel implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
public JFrame frame = new JFrame("Game Window");
public JPanel layout = new JPanel(new BorderLayout());
public JPanel menu = new JPanel();
public JPanel playing = new JPanel(new BorderLayout());
public JPanel game = new JPanel();
public BufferedImage cardArray[] = new BufferedImage[52];
public void begin() {
//starting menu
}
public void playersTurn() {
menu.add(playing);
Font font = new Font("",Font.PLAIN, 24);
JPanel btnHolder = new JPanel();
JLabel play = new JLabel("Playing:");
JLabel or = new JLabel(" or ");
JLabel question = new JLabel(" ? ");
question.setFont(font);
or.setFont(font);
play.setFont(font);
JButton hit = new JButton("Hit");
JButton stand = new JButton("Stand");
hit.addActionListener(this);
stand.addActionListener(this);
playing.add(play, BorderLayout.WEST);
playing.add(btnHolder, BorderLayout.CENTER);
btnHolder.add(hit);
btnHolder.add(or);
btnHolder.add(stand);
btnHolder.add(question);
}
public void gui() {
//main gui
Dimension imageD = new Dimension(71,96);
Dimension menuD = new Dimension(900,120);
menu.setBorder(BorderFactory.createLineBorder(Color.black));
menu.setPreferredSize(menuD);
JPanel titlePanel = new JPanel();
JLabel title = new JLabel("BlackJack");
title.setFont(new Font("", Font.PLAIN, 14));
titlePanel.add(title);
Graphic gr = new Graphic();
gr.setPreferredSize(imageD);
//adding
frame.add(layout);
layout.add(menu, BorderLayout.SOUTH);
layout.add(titlePanel, BorderLayout.NORTH);
layout.add(gr, BorderLayout.CENTER);
//frame settings
frame.setSize(900, 650);
frame.setResizable(false);
frame.setVisible(true);
}
public void buildPathArray() {
for(int i = 1; i<=52; i++){
BufferedImage im = null;
try {
im = ImageIO.read(new File(Blackjack.getInstallDir() + Blackjack.s + "src" + Blackjack.s + "cardpngs"+ Blackjack.s + (100+i)+".png"));
} catch (IOException e) {
e.printStackTrace();
}
cardArray[i-1]= im;
//System.out.println(Blackjack.getInstallDir() + "\\src\\cardpngs\\" + (100+i)+".png");
}
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("Hit")) {
} else if(e.getActionCommand().equals("Stand")) {
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
//g.setColor(Color.GREEN);
//g.fillOval(20, 20, 20, 20);
g.drawImage(cardArray[0], 0, 0, this);
}
}
输出如下:
您正在
21点
类中创建一个图形
实例
public class Blackjack {
public static String installDir = "";
public static String s = "";
public static void main(String[] args) {
//...
Graphic gr = new Graphic();
gr.buildPathArray();
gr.gui();
}
还有一个在你的Graphic
课上
public void gui() {
//...
Graphic gr = new Graphic();
gr.setPreferredSize(imageD);
//adding
//...
layout.add(gr, BorderLayout.CENTER);
//...
}
但您只需使用BlackBelt
类中实例的buildPathArray
初始化图像,而屏幕上实际显示的不是这些图像
一般来说,您不应该在另一个组件中创建JFrame
的实例来显示该组件。您的Graphic
组件也尝试执行太多操作。相反,我可能会有一个Game
类,它将标题、菜单和Graphic
组件拉到一起,然后将它们放在JFrame
主要原因是,您的Graphic
类试图做得太多了。它应全权负责卡片的展示和管理。Game
类应管理其他UI元素,并负责确保UI符合游戏“模型”的当前状态,接收用户输入(并侦听来自其他UI元素的事件),更新模型并响应模型创建的事件,更像
BlackJack
。。。
图形
。。。
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Font;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
导入javax.swing.BorderFactory;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
公共类图形扩展JPanel{
私有静态最终长serialVersionUID=1L;
公共BuffereImage cardArray[]=新BuffereImage[52];
公共空间开始(){
//开始菜单
}
公开无效玩家轮换(){
//所有这些都属于游戏
}
@凌驾
公共维度getPreferredSize(){
返回新维度(71,96);
}
public void buildPathArray(){
对于(inti=1;i您正在Blackjack
类中创建Graphic
的一个实例
public class Blackjack {
public static String installDir = "";
public static String s = "";
public static void main(String[] args) {
//...
Graphic gr = new Graphic();
gr.buildPathArray();
gr.gui();
}
还有一个在你的Graphic
课上
public void gui() {
//...
Graphic gr = new Graphic();
gr.setPreferredSize(imageD);
//adding
//...
layout.add(gr, BorderLayout.CENTER);
//...
}
但您只需使用BlackBelt
类中实例的buildPathArray
初始化图像,而屏幕上实际显示的不是这些图像
一般来说,你不应该在另一个组件中创建JFrame
的实例来显示该组件。你的Graphic
组件也试图做太多的事情。相反,我可能会有一个Game
类,它会拉取标题、菜单和GraphicJFrame的实例上
主要原因是,您的Graphic
类试图做得太多。它应该全权负责显示和管理卡片。Game
类应该管理其他UI元素,并负责确保UI符合游戏“模型”的当前状态,接受用户输入(并侦听来自其他UI元素的事件)更新模型并响应模型创建的事件,更像
BlackJack
。。。
图形
。。。
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Font;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
导入javax.swing.BorderFactory;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
公共类图形扩展JPanel{
私有静态最终长serialVersionUID=1L;
公共BuffereImage cardArray[]=新BuffereImage[52];
公共空间开始(){
//开始菜单
}
公开无效玩家轮换(){
//所有这些都属于游戏
}
@凌驾
公共维度getPreferredSize(){
返回新维度(71,96);
}
public void buildPathArray(){
对于(int i=1;i
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Graphic extends JPanel {
private static final long serialVersionUID = 1L;
public BufferedImage cardArray[] = new BufferedImage[52];
public void begin() {
//starting menu
}
public void playersTurn() {
// All of this belongs in Game
}
@Override
public Dimension getPreferredSize() {
return new Dimension(71,96);
}
public void buildPathArray() {
for (int i = 1; i <= 52; i++) {
BufferedImage im = null;
try {
im = ImageIO.read(new File(Blackjack.getInstallDir() + Blackjack.s + "src" + Blackjack.s + "cardpngs" + Blackjack.s + (100 + i) + ".png"));
} catch (IOException e) {
e.printStackTrace();
}
cardArray[i - 1] = im;
//System.out.println(Blackjack.getInstallDir() + "\\src\\cardpngs\\" + (100+i)+".png");
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
//g.setColor(Color.GREEN);
//g.fillOval(20, 20, 20, 20);
g.drawImage(cardArray[0], 0, 0, this);
}
}