2012-01-12 50 views
5

Tôi là một người mới bắt đầu java và cho dự án đầu tiên của tôi, tôi bắt đầu xây dựng một trò chơi Độc quyền.Các vấn đề về đồ họa Java

Tôi đang tạo GUI bằng SWING bằng phương pháp Đồ họa.

Hai vấn đề xuất hiện mà tôi không thể tìm thấy câu trả lời.

Điều đầu tiên là dường như tôi không thể đặt màu nền cho JPanel mà trước đây tôi đã thực hiện theo cách tương tự trong một JPanel khác trong cùng một dự án.

Điều thứ hai là tôi nhận được NullPointerException khi cố gắng thêm hình ảnh. Tôi đã quản lý để khắc phục lỗi này với try/catch nhưng có vẻ như Đồ họa sẽ không sơn. Mặc dù tôi đã sử dụng cùng một phương pháp để tải và thêm hình ảnh trong một JPanel trước đó và nó đã hoạt động.

Tôi nên đề cập rằng JFrame của tôi vào lúc này chứa 3 yếu tố mọi người trong đó có các lớp riêng biệt và được thêm vào thông qua BorderLayout().

Đây là mã cho lớp đó đang tạo ra vấn đề:

public class MonopolyBoard extends JPanel{ 


    Image atlantic; 
    MonopolyBoard() { 
     this.setBorder(new EtchedBorder()); 

     this.setBackground(new Color((80), (180), (210))); //this code dosent work 

     //this throws exception without try catch 
     try{ 
     ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/Atlantic Ave.jpg")); 
     atlantic = a.getImage(); 
     } 
     catch(NullPointerException e){} 
     } 

    public void paint(Graphics g){ 

      } 
      Graphics2D g2 = (Graphics2D) g; 
     //this code should draw the image but it dosent 
      g2.drawImage(atlantic, 100, 100, null); 
      g.drawImage(atlantic, 100, 100, this); 

    }; 
} 
+0

Đừng gõ 'thử/catch' đó. Đăng stacktrace. –

+4

"Chương trình Swing nên ghi đè' paintComponent() 'thay vì ghi đè' paint() '." - [Vẽ trong AWT và Swing: Phương pháp vẽ] (http://java.sun.com/products/jfc/tsc/ bài viết/painting/index.html # callbacks). – trashgod

+0

"điều này ném ngoại lệ mà không thử bắt" - điều này là không chính xác. Nếu khối không ném một ngoại lệ, nó làm như vậy bất kể thử/bắt. Khối try/catch của bạn làm gì là _hide_ ngoại lệ đó. Mà, đến lượt nó, làm cho nó khó mà không thể gỡ lỗi. Bạn cần phải hiểu _why_ rằng ngoại lệ được ném, không giấu nó dưới tấm thảm. – Mat

Trả lời

1

Bạn sẽ không biết trừ khi bạn in stacktrace bên trong khối catch. Nếu hàm tạo, new ImageIcon(), không ném ngoại lệ và thay vào đó trả về một đối tượng null, dòng tiếp theo, a.getImage(), chắc chắn sẽ gây ra NPE vì bạn không thể gọi phương thức trên đối tượng rỗng.

Thay vì điều này

//this throws exception without try catch   
try 
{   
    ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg")); 
    atlantic = a.getImage();   
}   
catch(NullPointerException e){} 

Hãy thử điều này

// the next line may be wrapped incorrectly due to MarkDown 
ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg")); 
if (a == null) 
{ 
    System.out.println("Can not find AtlanticAve.jpg"); 
    return; 
} 
    atlantic = a.getImage();   

Dòng

// the next line may be wrapped incorrectly due to MarkDown 
ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg")); 

Về cơ bản, bạn cần phải bắt đầu bằng cách nhìn thấy những gì có thể gây ra các nhà xây dựng nếu IMAGEtrong để trả lại một đối tượng null. Điều đó sẽ giúp bạn đi đúng hướng. Nó có thể là một cái gì đó do một cuộc gọi getResource() thất bại. Một cách đơn giản để tìm ra sẽ là tách dòng trên thành các phần của nó và cung cấp cho chúng các biến kết quả của riêng chúng. Đó là lộn xộn và không chính xác nhưng đó là cách xử lý sự cố đôi khi.

// using _var_ because I'm too lazy to look up the return types of the methods 
var x1 = this.getClass().getResource("../Card/AtlanticAve.jpg"); 
if (x1 == null) 
{ 
    System.out.println("Can't find my resource"); 
} 

Bạn có được bức tranh

+0

Tôi đã giải quyết được vấn đề Hình ảnh có vẻ như tôi đã đặt hình ảnh vào đúng gói ngay bây giờ vấn đề duy nhất của tôi là lý do tại sao nền được thiết lập? – user1146440

1

Tôi rất bối rối với mã của bạn nhưng tôi nghĩ rằng vấn đề là bảng điều khiển của bạn không vẽ !, phương pháp sơn bạn cần

@Override 
public void paintComponent(Graphics g){ 
    Graphics2D g2 = (Graphics2D) g; 
    //this code should draw the image but it dosent 
    g2.drawImage(atlantic, 100, 100, null); 
    g.drawImage(atlantic, 100, 100, this); 
} 
+0

Bạn có sử dụng nhật thực không? Nếu không bạn nên, nó sẽ dừng lại bạn có càng nhiều vấn đề :) vui chơi! –

+0

Tôi sử dụng Netbeans và nó đã xấu của tôi nó dident vẽ hình ảnh đã được trong gói bên phải thats lý do tại sao tôi đã nhận được ngoại lệ bây giờ vấn đề duy nhất tôi có là nền của JPanel isent thiết lập vì nó nên – user1146440

+0

lý do duy nhất tôi có thể xem là câu trả lời tôi đã đăng, rằng trong phương pháp vẽ của bạn không có gì đang được gọi. Câu trả lời ở trên cũng nên làm việc –

1

Thiết lập màu nền không có bất kỳ tác dụng bởi vì bạn ghi đè lên sơn(). Sơn chịu trách nhiệm vẽ nền.

Bạn cần sơn nền trong phương pháp sơn của bạn:

public void paint(Graphics g){ 
    // paint the background 
    g.fill(); // not sure about the parameters 
    // paint your image 
    g.drawImage(...); 
} 
+0

Thanx đây là vấn đề – user1146440