Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 图形图像的问题_Java_Swing_Graphics_Drawimage - Fatal编程技术网

Java 图形图像的问题

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

我一直在搜寻过去的StackOverflow帖子,试图找出我的图像无法显示的原因

我知道
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);
    }

}