2012-09-11 257 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); 
    } 
}