首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java通过导入映像保存jpanel问题

java通过导入映像保存jpanel问题
EN

Stack Overflow用户
提问于 2022-01-08 13:49:12
回答 1查看 67关注 0票数 1

我知道有类似的问题,但不完全是这样,我保存的jpanel罚款,但我有一些图像,我已经导入到程序,粉刷到jpanel上罚款,但相同的图像绘制在面板上没有保存在bufferedImage,有什么建议吗?

我可能会补充说,我已经尝试直接保存jpanel,但是我一直保存jpanel的开始图像,而不是更新的带有游戏屏幕的图片,如果您对我在那里做错了什么有任何建议的话,那就太棒了。

我的代码:

主班

代码语言:javascript
复制
public class WhackAMole extends JFrame implements Sprites{

    Board board = new Board();
    
    public WhackAMole(){
       
        this.setSize(BOARD_WIDTH, BOARD_HEIGHT);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setTitle("Whack-A-Mole");
        this.add(board);
        this.addMouseListener(board);
  
        
   }

    public static void main(String[] args) {
        
        java.awt.EventQueue.invokeLater(new Runnable() {
            
            @Override
            public void run() {
                
                new WhackAMole().setVisible(true);
            }
        });
    }
    
}
...

我的Jpanel课程

代码语言:javascript
复制
package whackamole;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.Timer;

/**
 *
 * @author hutch
 */
public class Board extends JPanel implements Sprites, MouseListener{
    
    Clouds[] clouds = new Clouds[4];   
    static MoleHill[] moleHill = new MoleHill[12];
    static Mole mole;
    
    private JButton start;
    private JLabel scoreBoardLabel;
    private JLabel countDownLabel;
    
    private ImageIcon ii;
    private Image title;
    
    private ImageIcon ii2;
    private Image scoreBoard;
    
    private int score;
    private int countdown = 3;
    
    private boolean gameScreen;
    private boolean inGame;
    
    private int levelSpeed = 10;
    
    private File backGroundFile = new File("Background.png");
   
    public Board(){
        
        this.setLayout(null);
        
        ii = new ImageIcon(getClass().getResource("Title.png"));
        title = ii.getImage().getScaledInstance(500, 110, Image.SCALE_SMOOTH);
        
        ii2 = new ImageIcon(getClass().getResource("ScoreBoard.png"));
        scoreBoard = ii2.getImage().getScaledInstance(270, 150, Image.SCALE_SMOOTH);
               
        scoreBoardLabel = new JLabel("", SwingConstants.CENTER);
        scoreBoardLabel.setBounds(330, 215, 115 , 80);
        scoreBoardLabel.setFont(new Font("Serif", Font.BOLD, 25));
        scoreBoardLabel.setForeground(Color.YELLOW);
     
        countDownLabel = new JLabel("", SwingConstants.CENTER);
        countDownLabel.setBounds(330, 215, 115 , 80);
        countDownLabel.setFont(new Font("Serif", Font.BOLD, 45));
        countDownLabel.setForeground(Color.BLACK);
                
        start = new JButton("START");
        start.setBounds(300, 400, 180 , 60);
        start.setFocusPainted(false);
        start.setFont(new Font("Serif", Font.BOLD, 25));
        start.setForeground(Color.WHITE);
               
        start.setBackground(new Color(102,68,0));
        start.addActionListener(new play());

        this.add(start);
        
        this.setSize(BOARD_WIDTH, BOARD_HEIGHT);
        initiateClouds();
        initiateMoleHills();
    
    }
    
    public Image background(){
        
        Image image = null;
        
        try {
            
            image = ImageIO.read(backGroundFile).getScaledInstance(BOARD_WIDTH, BOARD_HEIGHT, Image.SCALE_SMOOTH);
            
        } catch (IOException ex) {
            
            Logger.getLogger(Board.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return image;
    }
    
    
    /**
     * initiates cloud array
     */
    
    public final void initiateClouds(){

        for(int i =0 ; i < clouds.length; i++){
            
            clouds[i] = new Clouds(0,0);

        }        
    }
    
     /**
     * initiates mole array
     */
    
    public final void initiateMoleHills(){

        int y = 420;
        int x = 135;
        int width = -10;
        int height = 35;
        
        for(int i = 0 ; i < 4; i++){
            
            moleHill[i] = new MoleHill(x, y, width, height);
                          
            x += 120;
                                                               
        }    
        
        y = 570;
        x = 75;
        width = 20;
        height = 50;
        
        for(int j = 4 ; j < 8; j++){
            
            moleHill[j] = new MoleHill(x, y, width, height);
                
            x += 160;
                                                               
        } 
        
        y = 780;
        x = 15;
        width = 50;
        height = 80;
        
        for(int k = 8 ; k < 12; k++){
            
            moleHill[k] = new MoleHill(x, y, width, height);
                
            x += 190;
                                                               
        }     
    }
    
    /**
     *
     * @param g
     */
    
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        
        Graphics2D g2d = (Graphics2D) g;

        startScreen(g);
            
        
        if(gameScreen == true){
            
            gameScreen(g);          
                      
        }
        if(inGame == true && gameScreen == true){

            playing(g);
        }
    }
    
    /**
     * painting the start screen
     * @param g
     */
    
    public void startScreen(Graphics g){
        
        Graphics2D g2d = (Graphics2D) g;
        
        this.setBackground(new Color(128,191,255));     //blue sky
        drawTitle(g);
       
        
    }
    
        
    /**
     * painting the game screen
     * @param g
     */
    
    public void gameScreen(Graphics g){
        
        Graphics2D g2d = (Graphics2D) g;

        drawTitle(g);
        drawClouds(g);
        drawFieldAndHill(g);
        drawScoreBoard(g);
        drawHideBar(g);
        drawMoleHills(g);
 
         //saveBackground();  --------------------------------------WAS HERE----------------------------------------<
    }
            
    /**
     * painting the game screen
     * @param g
     */
    
    public void playing(Graphics g){
        
        
        Graphics2D g2d = (Graphics2D) g;

        drawFieldAndHill(g);
        drawTitle(g);
        drawClouds(g);        
        drawScoreBoard(g);
        drawMole(g);
        drawHideBar(g);
        drawMoleHills(g);
               
    }
       
    /**
     * draws main title
     * @param g 
     */
    
    public void drawTitle(Graphics g){
        
        Graphics2D g2d = (Graphics2D) g;
                              
        g2d.drawImage(title, 150, 70, null);
        
    }
    
    /**
     * draws scoreboard
     * @param g 
     */
    
    public void drawScoreBoard(Graphics g){
        
        Graphics2D g2d = (Graphics2D) g;
                              
        g2d.drawImage(scoreBoard, 250, 200, null);
        
    }
    
    /**
     * draws clouds
     * @param g 
     */
    
    public void drawClouds(Graphics g){
        
        Graphics2D g2d = (Graphics2D) g;
        
        for(int i = 0 ; i < clouds.length; i++){             //drawing clouds

            g2d.drawImage(clouds[i].getImage(), clouds[i].getX() + clouds[i].move(), clouds[i].getY(), this);

            if(clouds[i].getX() + clouds[i].movement == BOARD_WIDTH + 200){

                clouds[i].setMove();
                
            }
        }
    }
    
    /**
     * draws bars to hide moles
     * @param g 
     */
    
    public void drawHideBar(Graphics g){
        
        Graphics2D g2d = (Graphics2D) g;
        
        g2d.setColor(new Color(102,204,0)); 
        
        g2d.fillRect(0, 445, BOARD_WIDTH, 50);            //top part for upper moles
        
        g2d.fillRect(0, 605, BOARD_WIDTH, 80);            //middlepart for middle moles
        
        g2d.fillRect(0, 830, BOARD_WIDTH, 50);   //bottom part for lower moles
    }
    
    /**
     * draws mole hills
     * @param g 
     */
    
    public void drawMoleHills(Graphics g){
        
        Graphics2D g2d = (Graphics2D) g;
        
        for(int i = 0 ; i < moleHill.length; i++){           //mole hills
            
            g2d.drawImage(moleHill[i].getImage(), moleHill[i].getX(), moleHill[i].getY(), this); 
        }
    }
    
    /**
     * draws hills and fields
     * @param g 
     */
    
    public void drawFieldAndHill(Graphics g){
        
        Graphics2D g2d = (Graphics2D) g;
        
        g2d.setColor(new Color(30,179,0));                  //darker outlines
        g2d.drawOval(0, 300, BOARD_WIDTH, BOARD_HEIGHT);
        g2d.drawRect(-5, 500, BOARD_WIDTH, BOARD_HEIGHT);
        
        g2d.setColor(new Color(102,204,0));
        g2d.fillRect(0, 400, BOARD_WIDTH, BOARD_HEIGHT);            //hill and field
        g2d.fillOval(0, 300, BOARD_WIDTH, BOARD_HEIGHT);
    }
    
    /**
     * draws moles
     * @param g 
     */
    
    public void drawMole(Graphics g){
        
        Graphics2D g2d = (Graphics2D) g;
        
        g2d.drawImage(mole.getImage(), mole.getX(), mole.getY() + mole.move(), this);
           

    }
    
    /**
     * saves the background
     */
    
    public final void saveBackground(){
        
        if(!backGroundFile.exists()){
            
            BufferedImage image = new BufferedImage(BOARD_WIDTH, BOARD_HEIGHT,BufferedImage.TYPE_INT_RGB);

            try {

                Graphics2D graphic = image.createGraphics();  
                repaint();
                printAll(graphic); 

                ImageIO.write(image, "png", backGroundFile);
              

            } catch (IOException ex) {

                Logger.getLogger(Board.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    /**
     * updates scoreboard with score
     */
    
    public void updateScore(){
        
        scoreBoardLabel.setText(String.valueOf(score));
    }
  

    /**
     * method to start the game process
     */
    
    public void playGame(){
                
        countDown();
         
        ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
           
            Runnable task = () -> {  
                
                mole = new Mole(35,790,0,0,false);
                inGame = true;  
                this.add(scoreBoardLabel); 
                scoreBoardLabel.setVisible(true);
                saveBackground();                       //NOW HERE-------------------------------------------<
                
                new Timer(10, new ActionListener(){
                    
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        
                        updateScore();
                        repaint();
                        
                        if(score >= 50){
                             
                            inGame = false;
                            repaint();
                            start.setVisible(true);
                            start.setText("NEXT LEVEL");
                            Mole.speed ++;
                            countdown = 3;
                            score = 0;
                            scoreBoardLabel.setVisible(false);
                            updateScore();                            
                            ((Timer)e.getSource()).stop();
                            
                        }
                    }
                    
                }).start();
            };
            
            ex.schedule(task, 4000, TimeUnit.MILLISECONDS); 
    }
    
    public void countDown(){
        
        this.add(countDownLabel);
        countDownLabel.setVisible(true);
        countDownLabel.setText(String.valueOf(countdown));       
        
        new Timer(1000, new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                   
                countdown --;
                countDownLabel.setText(String.valueOf(countdown));                
                
                if(countdown == 0){
                    
                    countDownLabel.setText("GO");
                    
                }
                if(countdown == -1){
                    
                    ((Timer)e.getSource()).stop();
                    countDownLabel.setVisible(false);
                }
            }
        }).start();      
    }
    
    @Override
    public void mouseClicked(MouseEvent e) {
        
        if(mole.getBounds().contains(e.getPoint())){
            
            if(mole.isHit() == false){
                
                mole.hit();
                
                int level = mole.getOriginalY();
                
                switch(level){
                    
                    case 790:
                        
                        score += 5;
                        
                        break;
                        
                    case 580:
                        
                        score += 15;
                        
                        break;
                        
                    case 430:
                        
                        score += 25;
                        
                        break;
                }
            }
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {
        
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        
    }

    @Override
    public void mouseExited(MouseEvent e) {
        
    }
    

    class play implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            
            start.setVisible(false);
            
            gameScreen = true; 
            start.setVisible(false);

            repaint();
                
            playGame();
   
            setCursor(Toolkit.getDefaultToolkit().createCustomCursor(
            new ImageIcon(getClass().getResource("Mallet.png")).getImage().getScaledInstance(400, 400, Image.SCALE_SMOOTH),
            new Point(0,0),"custom cursor"));;

        }
        
        
    }
    public static BufferedImage imageToBufferedImage(Image im) {
        
        BufferedImage bi = new BufferedImage
           (im.getWidth(null),im.getHeight(null),BufferedImage.TYPE_INT_RGB);
        Graphics bg = bi.getGraphics();
        bg.drawImage(im, 0, 0, null);
        bg.dispose();
        return bi;
  }
    
}

..。

我得到了什么

我想要的

EN

回答 1

Stack Overflow用户

发布于 2022-01-10 18:03:14

没有绘制图像的原因是Graphics#drawImage没有绘制图像。

要解决这一问题,您将在用于呈现我创建的do will循环的方法中看到,以检查draw方法是否返回true。这表明图像已经绘制成功。

..。

代码语言:javascript
复制
 public void startScreen(Graphics g){
    
    Graphics2D g2d = (Graphics2D) g;
    
    g2d.setColor(new Color(128,191,255));
    g2d.fillRect(0, 0, BOARD_WIDTH, BOARD_HEIGHT);   //blue sky
    
    Ellipse2D.Double circle = new Ellipse2D.Double(40, 40, 80, 80);   //sun
    
    g2d.setColor(Color.YELLOW); 
    g2d.fill(circle);
           
    boolean cloudImage1 = false;
    boolean cloudImage2 = false;
    
    do{                         //start clouds
        
        cloudImage1 = g2d.drawImage(startclouds[0].getImage(), 90, 100, null);
        cloudImage2 = g2d.drawImage(startclouds[1].getImage(), 600, 100, null);
        
    }while(cloudImage1 == false || cloudImage2 == false);
    
    drawTitle(g);           //draws main title

    g2d.setColor(new Color(102,204,0));                 //green grass
    g2d.fillRect(0, 560, BOARD_WIDTH, BOARD_HEIGHT);
                    
    boolean fenceCheck1 = false;
    boolean fenceCheck2 = false;
    
    do{                         //draws fence
        
        fenceCheck1 = g2d.drawImage(fence, -105, 370, null);
        fenceCheck2 = g2d.drawImage(fence, fence.getWidth(null) / 2 + 8, 370, null);
        
    }while(fenceCheck1 == false);   //check image is loaded before save

    for(int i = 0 ; i < startMoles.length;){            //start screen moles
        
        boolean check = g2d.drawImage(startMoles[i].getImage(), startMoles[i].getX(), startMoles[i].getY(), null);
        
        if(check == true){          //check image is loaded before save
            
            i++;
        }
    }
      
    for(int i = 0 ; i < startMoleHills.length;){           //start screen mole hills

        boolean check = g2d.drawImage(startMoleHills[i].getImage(), startMoleHills[i].getX(), startMoleHills[i].getY(), this); 

        if(check == true){      //check image is loaded before save
            
            i++;
            
        }
    }

    boolean grassImage1 = false;
    boolean grassImage2 = false;
    boolean grassImage3 = false;       

    do{                                         //grass oimages
               
        grassImage1 = g2d.drawImage(grass, 100, 700, null);      //check image is loaded before save
        grassImage2 = g2d.drawImage(grass, 500, 650, null);      //check image is loaded before save
        grassImage3 = g2d.drawImage(grass, 600, 500, null);      //check image is loaded before save
    
    }while(grassImage1 == false || grassImage2 == false || grassImage3 == false);
    
    boolean flowerImage1 = false;
    boolean flowerImage2 = false;
    
    do{                                         //flower images
        
        flowerImage1 = g2d.drawImage(flower1, 50, 600, null);        //check image is loaded before save
        flowerImage2 = g2d.drawImage(flower1, 600, 700, null);        //check image is loaded before save
        
    }while(flowerImage1 == false || flowerImage2 == false);
    
}

..。

这是保存面板的方法。

..。

代码语言:javascript
复制
public final void saveStartBackground(){
    
    if(!startBackGroundFile.exists()){
        
        BufferedImage image = new BufferedImage(BOARD_WIDTH, BOARD_HEIGHT,BufferedImage.TYPE_INT_RGB);

        try {

            Graphics2D graphic = image.createGraphics();  

            startScreen(graphic);    

            ImageIO.write(image, "png", startBackGroundFile);


        } catch (IOException ex) {

            Logger.getLogger(Board.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

..。

这是启动保存的方法。

..。

代码语言:javascript
复制
  public void loadGame(){
    
    gamePlayMusic();
    saveStartBackground();
    saveBackground();
    saveEndBackground();
    gunShot();
    moleNoise();
    this.add(start);
}

..。

在jframe设置为可见之前,我称之为它,因此,在游戏开始之前,确保面板都是好的。

..。

代码语言:javascript
复制
public class WhackAMole extends JFrame implements Sprites{

Board board = new Board();

public WhackAMole(){
   
    this.setSize(BOARD_WIDTH, BOARD_HEIGHT);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setLocationRelativeTo(null);
    this.setTitle("Whack-A-Mole");
    this.add(board);
    this.addMouseListener(board);
    
    board.loadGame();

    this.setVisible(true);
    this.setResizable(false);
    
  }

public static void main(String[] args) {
    
    java.awt.EventQueue.invokeLater(new Runnable() {
        
        @Override
        public void run() {
            
            new WhackAMole();
        }
    });
}

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70632940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档