2015-10-23 4 views
0

Я использую java3D и хочу передать идентификатор выбранных элементов в мой класс. однако это не удается. он может распечатать идентификатор, а также передать его в текстовый текст. но он говорит nullPointerException в строке game.btClicked (текст); как я могу передать ID моему классу?как передать параметр с mouseClicked?

public class GUI extends JFrame implements ActionListener, MouseListener { 

    private Game game; 
    private String text; 

    public GUI(Game game /*...*/) { 

    this.game = game; 
    //....... 
    } 

    //....... 
    public void mouseClicked(MouseEvent e) { 
    pickCanvas.setShapeLocation(e); 
    Primitive pickedShape = null; 
    PickResult result = pickCanvas.pickClosest(); 

    if (result != null) { 
     pickedShape = (Primitive) result.getNode(PickResult.PRIMITIVE); 
    } 

    //actions to be carried out when object is clicked 
    if (pickedShape != null) { 
     System.out.println("clicked: " + pickedShape.getName()); 
     String text = pickedShape.getName(); 
     System.out.println(text); 
     game.btClicked(text); 
    } else { 
    } 
    } 
} 

общественного класса Game {

public Game(){ 

// .......

}

public void btClicked(String text) { 
    spielfeld.disableAll(); 
    int buttonNr = Integer.parseInt(text); 
    System.out.println("step: "+step+ " nr: "+buttonNr); 
    // ....... 

}}

следующего является трассировка стека:

щелкнул: 38

Исключение в потоке "АВТ-EventQueue-0" java.lang.NullPointerException

at spiel.Game.btClicked(Game.java:403) 

at spiel.SpielGUI.mouseClicked(GUI.java:552) 

at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$500(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 

, что довольно много, но большинство из-за другие проблемы, я кодирую новый графический интерфейс для игры, поэтому есть еще какой-то код, который нужно изменить. так что просто взгляните на первые строки.
"GUI.java:552" ссылается на "game.btClicked (текст);"
«Game.java:403» ссылаются на «spielfeld.disableAll();» но я уверен, что эта линия в порядке.

+2

Добро пожаловать в StackOverflow! Нам понадобится полная трассировка стека вашей ошибки и, конечно, код 'Game :: btClicked', чтобы помочь вам :) – NiziL

ответ

2

У вас нет конструктора в коде, который вы предоставили. У вас есть метод, который очень похож на конструктор. Я предполагаю, что игра не будет инициализирована.

Конструктор не определяет тип возврата. В вашем случае у вас есть

public void GUI(Game game ....) 

Когда вы на самом деле нужно

public GUI(Game game ....) 

Вот пример:

public class GUI { 
    boolean b = false; 
    public static void main(String[] args) { 
     GUI g = new GUI(); 
     System.out.println(g.b); 
    } 
    public void GUI() { 
     b = true; 
    } 
} 

Обеспечивает выход:

run: 
false 
BUILD SUCCESSFUL (total time: 2 seconds) 

В то время как правильный конструктор будет :

public class GUI { 
    boolean b = false; 
    public static void main(String[] args) { 
     GUI g = new GUI(); 
     System.out.println(g.b); 
    } 
    public GUI() { 
     b = true; 
    } 
} 

Что дает:

run: 
true 
BUILD SUCCESSFUL (total time: 1 second) 
+1

Мне нравится называть эти« псевдоконструкторы ». Хороший пикап. 1+ –

+0

Это хорошее название для этого. Я должен это вспомнить. – Creperum

+0

Извините, что я набрал это вручную и сделал ошибку «public void GUI (Game Game ....)», но в моем коде на самом деле нет «void», поэтому проблема не в конструкторе. но спасибо в любом случае;) – andreas