2012-09-11 83 views
2

我在慢慢學習java,並決定嘗試構建一個tic tac toe遊戲。我試圖畫出畫板,我發現了一種簡單的方法來繪製每個人都會說的線條。我到目前爲止:在JFrame中使用圖形時出現空指針異常(Swing)

public void constructBoard() { 
    JFrame frame = new JFrame("Tic Tac Toe"); 
    frame.setSize(600,600); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    frame.toFront(); 
    Graphics lines = new Graphics(); 
    lines = getGraphics(); 
    lines.drawLine(100,100,300,500); 
    lines.setColor(Color.black); 
    // JLabel label = new JLabel ("Hello, World!", SwingConstants.CENTER); 
    // frame.add(label, BorderLayout.CENTER); 
} 

我的JFrame出現了,我的標題在那裏,但沒有線。我已經試過許多東西,其中WAW一個單獨的方法爲線,如:

public void drawBoard(Graphics lines){ 
    lines = getGraphics(); 
    lines.drawLine(100,100,300,500); 
    lines.setColor(Color.black); 
} 

但是,當我把這個在我的主類,它告訴我,我需要括號之間的事情,以匹配型顯卡。我的編譯器(Eclipse)推薦使用null,但對我來說,這可能會導致空指針異常。

我在Board類中使用構造板方法,並在其中使用帶有super()的構造函數Board()。

public Board(){ 
     super(); 
    } 

然後,我有一個主類,只是使板類型的對象,並調用我的方法。我已經搜索到了我所知道的任何地方,並且到處都有說我擁有的是繪製線條的方式。然後,我發現有空指針異常的其他人還沒有得到解決方案,或沒有得到一個適合我的解決方案。我試過DebugGraphics,把它全部放在主類中,而lines = new Graphics();但是這給了我一個錯誤。謝謝你的幫助。

全膳食類:

import java.awt.Color; 
import java.awt.Graphics; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 



public class Board extends JPanel { 
     public Board(){ 
      super(); 
     } 
     public void constructBoard() { 
      JFrame frame = new JFrame("Tic Tac Toe"); 
      frame.setSize(600,600); 
      frame.setVisible(true); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLocationRelativeTo(null); 
       frame.toFront(); 
       Graphics lines = new Graphics(); 
       lines = getGraphics(); 
       lines.drawLine(100,100,300,500); 
      lines.setColor(Color.black); 
      // JLabel label = new JLabel ("Hello, World!", SwingConstants.CENTER); 
      // frame.add(label, BorderLayout.CENTER); 
     } 
} 

全部主類:

import java.awt.Color; 
import java.awt.Graphics; 


public class Main { 

    /** 
    * @param args 
    */ 
      public static void main(String[] args) { 
       // TODO Auto-generated method stub 
        Board board = new Board(); 
        board.constructBoard(); 

      } 

} 
+0

嗨 - 嘗試使用 「的paintComponent()」:Java2D的:介紹和教程(http://www.apl.jhu.edu/~hall/java/Java2D-Tutorial.html),或[Java圖形 - 繪畫和重繪](http://www.tech-recipes.com/rx/1177/java-graphics-paint-and-repaint/)。 – paulsm4

+0

如果我知道如何解決問題,看起來會有用。我只是不明白爲什麼我這樣做不會奏效。這是我能找到的最常用的方式,但在任何地方,我都發現人們希望提問者使用新的更復雜的東西來解決這個問題。這背後有一些推理嗎? –

+0

訣竅是不只是「繪製某些東西」,而是要繪製*響應*到一個*(重複)繪製事件*。我原本打算建議一個onPaint()處理程序,但是我發現的兩個第一個教程都使用了「paintComponent()」。 '希望能幫助.. PSM – paulsm4

回答

0

我認爲你在錯誤的方式啓動。請參閱下面的概念證明,向您展示如何實際覆蓋JPanelpaintComponent方法,以便能夠在其中顯示自定義繪製的圖形內容。這是你必須畫板的地方。

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class App { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Test"); 
     frame.getContentPane().add(new MainPanel()); 
     frame.setBounds(100, 100, 600, 400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

class MainPanel extends JPanel { 
    MainPanel() { 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.BLUE); 
     int width = getWidth(); 
     int height = getHeight(); 
     drawBoard((Graphics2D) g, width, height); 
    } 

    private void drawBoard(Graphics2D g2, int width, int height) { 
     // TODO: this is the place where you actually want to draw your board 
     g2.drawRect(10, 10, width - 20, height - 20); 
    } 
} 
相關問題