Проблемы с графикой drawImage

Я просматривал последние сообщения в Stackru и пытался выяснить, почему мое изображение не отображается.

Я знаю что ImageIO хорошо, так как я могу бежать getWidth() на моем BufferedImage и он возвращает правильную ширину.

Вот мой Graphic класс, а затем мой основной класс. (Я извиняюсь за дрянной код, я новичок в этом.)

Код в 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); 
}

}

Код в моем основном классе:

package blackjack;

import java.nio.file.Path;
import java.nio.file.Paths;

public class Blackjack {
public static String installDir = ""; 
public static String s = ""; 

public static void main(String[] args) {
    Path currentRelativePath = Paths.get("");
    installDir = currentRelativePath.toAbsolutePath().toString();
    s = System.getProperty("file.separator");
    Graphic gr = new Graphic();
    gr.buildPathArray();
    gr.gui();
    //System.out.println(installDir);
    //g.playersTurn();

}
public static String getInstallDir() {
    return installDir; 
}

}

Выход такой:

1 ответ

Вы создаете один экземпляр Graphic в вашем Blackjack учебный класс...

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); 
    //...
}

Но вы только инициализируете изображения, используя buildPathArray примера в вас BlackBelt класс, который не то, что на самом деле отображается на экране...

Как правило, вам не следует создавать экземпляр JFrame из другого компонента с явной целью отображения этого компонента. Ваш Graphic Компонент также пытается сделать слишком много. Вместо этого я бы Game класс, может быть, который вытащил заголовок, меню и Graphic компоненты вместе, а затем положить это на экземпляр JFrame

Основная причина этого заключается в том, Graphic класс пытается сделать слишком много. Он должен нести полную ответственность за показ карт и управление ими. Game класс должен управлять другими элементами пользовательского интерфейса и отвечать за обеспечение того, чтобы пользовательский интерфейс соответствовал текущему состоянию "модели" игры, принимая входные данные пользователя (и прослушивая события от других элементов пользовательского интерфейса) и обновляя модель и реагируя на события, которые модель создает, немного больше похоже на...

BlackJack...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class BlackJack {

    public static void main(String[] args) {
        new BlackJack();
    }

    public BlackJack() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new Game());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class Game extends JPanel {

        private JPanel menu;
        private Graphic graphic;

        public Game() {

            menu = new JPanel() {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(900, 120);
                }
            };
            menu.setBorder(BorderFactory.createLineBorder(Color.black));

            JPanel titlePanel = new JPanel();
            JLabel title = new JLabel("BlackJack");
            title.setFont(new Font("", Font.PLAIN, 14));
            titlePanel.add(title);

            Graphic gr = new Graphic();
            gr.buildPathArray();

            setLayout(new BorderLayout());

            add(menu, BorderLayout.SOUTH);
            add(titlePanel, BorderLayout.NORTH);
            add(gr, BorderLayout.CENTER);
        }

    }

}

Graphic...

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);
    }

}

Вы также можете взглянуть на Model-View-Controller.

Другие вопросы по тегам