2013-09-25 4 views
-1

이것은 내 첫 번째 Java GUI 프로그램이며 실제로는 두 번째 Java 프로그램이므로 내게는 쉽게 받아 들일 수 있습니다 :) 내 프로그램은 인터넷 검색 및 독서 자바 문서를 많이 읽은 결과입니다. 내 문제는 내가 52 카드의 스프라이트 시트가 있고, subImage를 사용하여 버퍼 이미지 배열에 개별적으로 이러한 카드를 저장하려고 시도하고 테스트 목적으로 만 모든 52를 창에 표시한다는 것입니다. 파일이 올바른 디렉토리에 있는지 확인했습니다. 내 문제는 Jlabels를 사용하는 것 또는 단순히 어리석은 실수라고 생각합니다. 어쨌든, 여기JLabel은 이미지를 표시하지 않습니다 - NullPointerException

package gui; 
import javax.swing.JFrame; 
import java.awt.Color; 


public class cards extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public cards(){ 

     setTitle("Poker"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(1000, 700); 
     setLocationRelativeTo(null); 
     this.getContentPane().setBackground(Color.GREEN); 
     setVisible(true); 
     setResizable(false); 
     add(new crdimgs()); 

    } 

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

오류가 나는 순간에받는 스프라이트 시트 분할을

package gui; 

import java.awt.GridLayout; 
import java.awt.image.BufferedImage; 
import java.io.File; 


import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class crdimgs extends JPanel {/** 
* 
*/ 
    static final long serialVersionUID = 1L; 
    public final int width = 10; 
    public final int height = 20; 
    public int rows = 13; 
    public int cols = 5; 

    public BufferedImage image; 
    File cardimg = new File("Cards.jpg"); 
    BufferedImage cards[]; 

    public void loadsplit(File loadimage){ 

     try{ 
      image = ImageIO.read(loadimage); 

      } catch(Exception error){ 
       System.out.print("error"); 
       } 


     cards = new BufferedImage[cols*rows]; 

    } 

    public crdimgs() { 
     loadsplit(cardimg); 
     setLayout(new GridLayout(rows, cols, 1, 1)); 

     int x = 0; 
     int y = 0; 
     int subimg = 0; 

     for(int i = 0; i < rows; i++) 
     { 
      JPanel panel = new JPanel(); 
      cards[subimg] = new BufferedImage(width, height, 5); 
      cards[subimg] = image.getSubimage(x, y, width, height); 
      panel.add(new JLabel(new ImageIcon(cards[subimg]))); 
      add(panel); 
      x+=width; 
      subimg++; 
     } 
     y+=height; 
     x=0; 
     } 
    } 
} 

을 수행 내 수업 그리고 내 주요 클래스는 다음과 같습니다

errorException in thread "main" java.lang.NullPointerException 
at gui.crdimgs.<init>(crdimgs.java:53) 
at gui.cards.<init>(cards.java:22) 
at gui.cards.main(cards.java:28) 
+0

참고하여'Exception'의 첫 줄을 ...'스레드 errorException "주요"java.lang.NullPointerException' ,'ImageIO.read' 문에서 오는'error'로 시작합니다. 파일을 읽으 려 할 때 뭔가 잘못되었습니다. 호버크라프트의 조언에 따라 – MadProgrammer

답변

4

가능성이 이미지가 null 아마도 잘못된 장소를 찾고 있기 때문에 가능할 것입니다. 그러나 찾으려면 53 행을 확인하십시오.

개 제안 :

  • 시작 작은 다음에 구축 할 수 있습니다. 단일 이미지를 성공적으로 읽고 표시 할 때까지 복잡한 이미지 조작을 시도하지 마십시오.
  • 자바가 이미지를 찾는 위치를 확인하십시오. 아마도 그것이 어디에 있다고 생각하지 않기 때문일 수 있습니다. 찾으려면 코드에 System.out.println(System.getProperty("user.dir"));을 넣으십시오.
  • 이후에 setVisible(true)으로 전화하여 모든 구성 요소를 JFrame에 추가하십시오.
  • 스택 추적을 인쇄하여 예외 표시 코드를 향상 시키십시오. error.printStackTrace() (감사합니다. Mad!).
  • 예를 들어

:

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

import javax.imageio.ImageIO; 
import javax.swing.*; 

public class PlayingCardTest { 


    public static void main(String[] args) { 
     String pathToDeck = "http://www.jfitz.com/cards/classic-playing-cards.png"; 
     try { 
     final List<ImageIcon> cardImgList = CreateCards.createCardIconList(pathToDeck); 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame("Moving Cards"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new CardGameTable(cardImgList, frame)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
     } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     System.exit(-1); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     System.exit(-1); 
     } 
    } 
} 

@SuppressWarnings("serial") 
class CardGameTable extends JLayeredPane { 

    private static final int PREF_W = 600; 
    private static final int PREF_H = 400; 
    private static final Color BASE_COLOR = new Color(0, 80, 0); 
    private static final int CARD_COUNT = 20; 
    private static final int WIDTH_SHOWING = 20; 

    private JPanel basePane = new JPanel(null); 

    public CardGameTable(List<ImageIcon> cardImgList, final JFrame frame) { 
     basePane.setSize(getPreferredSize()); 
     basePane.setBackground(BASE_COLOR); 
     add(basePane, JLayeredPane.DEFAULT_LAYER); 

     final MyMouseAdapter myMouseAdapter = new MyMouseAdapter(this, basePane); 
     addMouseListener(myMouseAdapter); 
     addMouseMotionListener(myMouseAdapter); 

     for (int i = 0; i < CARD_COUNT; i++) { 
     JLabel card = new JLabel(cardImgList.remove(0)); 
     card.setSize(card.getPreferredSize()); 
     int x = (PREF_W/2) + WIDTH_SHOWING * (CARD_COUNT - 2 * i)/2 - 
       card.getPreferredSize().width/2; 
     int y = PREF_H - card.getPreferredSize().height - WIDTH_SHOWING * 2; 
     card.setLocation(x, y); 
     basePane.add(card); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

} 

class MyMouseAdapter extends MouseAdapter { 
    private JLabel selectedCard = null; 
    private JLayeredPane cardGameTable = null; 
    private JPanel basePane = null; 
    private int deltaX = 0; 
    private int deltaY = 0; 

    public MyMouseAdapter(JLayeredPane gameTable, JPanel basePane) { 
     this.cardGameTable = gameTable; 
     this.basePane = basePane; 
    } 

    @Override 
    public void mousePressed(MouseEvent mEvt) { 
     Component comp = basePane.getComponentAt(mEvt.getPoint()); 
     if (comp != null && comp instanceof JLabel) { 
     selectedCard = (JLabel) comp; 
     basePane.remove(selectedCard); 
     basePane.revalidate(); 
     basePane.repaint(); 

     cardGameTable.add(selectedCard, JLayeredPane.DRAG_LAYER); 
     cardGameTable.revalidate(); 
     cardGameTable.repaint(); 
     deltaX = mEvt.getX() - selectedCard.getX(); 
     deltaY = mEvt.getY() - selectedCard.getY(); 
     } 
    } 

    @Override 
    public void mouseReleased(MouseEvent mEvt) { 
     if (selectedCard != null) { 
     cardGameTable.remove(selectedCard); 
     cardGameTable.revalidate(); 
     cardGameTable.repaint(); 

     basePane.add(selectedCard, 0); 
     basePane.revalidate(); 
     basePane.repaint(); 
     selectedCard = null; 
     } 
    } 

    @Override 
    public void mouseDragged(MouseEvent mEvt) { 
     if (selectedCard != null) { 
     int x = mEvt.getX() - deltaX; 
     int y = mEvt.getY() - deltaY; 
     selectedCard.setLocation(x, y); 
     cardGameTable.revalidate(); 
     cardGameTable.repaint(); 
     } 
    } 
} 

class CreateCards { 
    private static final int SUIT_COUNT = 4; 
    private static final int RANK_COUNT = 13; 

    public static List<ImageIcon> createCardIconList(String pathToDeck) 
     throws MalformedURLException, IOException { 
     BufferedImage fullDeckImg = ImageIO.read(new URL(pathToDeck)); 
     int width = fullDeckImg.getWidth(); 
     int height = fullDeckImg.getHeight(); 
     List<ImageIcon> iconList = new ArrayList<ImageIcon>(); 

     for (int suit = 0; suit < SUIT_COUNT; suit++) { 
     for (int rank = 0; rank < RANK_COUNT; rank++) { 
      int x = (rank * width)/RANK_COUNT; 
      int y = (suit * height)/SUIT_COUNT; 
      int w = width/RANK_COUNT; 
      int h = height/SUIT_COUNT; 
      BufferedImage cardImg = fullDeckImg.getSubimage(x, y, w, h); 
      iconList.add(new ImageIcon(cardImg)); 
     } 
     } 
     Collections.shuffle(iconList); 
     return iconList; 
    } 
} 

보여줍니다
enter image description here

+0

예외가 발생하면'System.out.print ("error");를 출력하는 대신에 error.printStackTrace();를 사용하거나 예외를 다시 던지십시오. – MadProgrammer

+0

@MadProgrammer : 좋은 지적 , 감사! –

+1

출력에 접두사가 붙는 "오류"를 보았습니다. – MadProgrammer

관련 문제