2016-09-24 184 views
0

我有一个项目,我要求用户使用什么类型的电子设备来告诉他们需要多少个太阳能电池板和电池。在JavaFX的GridPane中从TextArea中获取文本

为了收集信息,我使用了一个带有三列的gridpane,其中有TextArea和可变数量的行。我需要收集gridPane的第二行和第三行中的信息。

我用下面的方法找到了另一个问题。

private void calculer(ActionEvent event) 
{ 
    double ampApp = 0; 
    double heureApp = 0; 
    double wattTotal = 0; 
    double nbJourAuto; 
    double heureSoleil; 
    int nbPanneau; 
    int nbBatterie; 
    String stringTemp; 

    for(int i =1; i < rangee; i++) 
    { 
     stringTemp = getNodeByRowColumnIndex(i, 1, gridApp).toString(); 
     ampApp += parseDouble(stringTemp); 
    } 

    for(int i =1; i < rangee; i++) 
    { 
     stringTemp = getNodeByRowColumnIndex(i, 2, gridApp).toString(); 
     heureApp += parseDouble(stringTemp); 
    } 

(这是唯一的方法的第一部分,我知道有一个缺少 “}”)

这里是getNodeByRowColumnIndex代码:

public Node getNodeByRowColumnIndex(final int row, final int column, GridPane gridPane) { 
    Node result = null; 
    ObservableList<Node> childrens = gridPane.getChildren(); 
    for(Node node : childrens) 
    { 
     if(gridPane.getRowIndex(node) == row && gridPane.getColumnIndex(node) == column) 
     { 
      result = node; 
      break; 
     } 
    } 
    return result; 
} 

这个方法我试过,但不断得到java.lang.NullPointerException

有谁知道为什么以及如何解决这个问题?

编辑:

如这里要求的堆栈跟踪

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774) 
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) 
at javafx.event.Event.fireEvent(Event.java:198) 
at javafx.scene.Node.fireEvent(Node.java:8411) 
at javafx.scene.control.Button.fire(Button.java:185) 
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) 
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96) 
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) 
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 
at javafx.event.Event.fireEvent(Event.java:198) 
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757) 
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) 
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) 
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:380) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:294) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:416) 
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:415) 
at com.sun.glass.ui.View.handleMouseEvent(View.java:555) 
at com.sun.glass.ui.View.notifyMouse(View.java:937) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.reflect.InvocationTargetException 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71) 
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275) 
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769) 
... 48 more 
Caused by: java.lang.NullPointerException 
at systemesolaire.FXMLDocumentController.getNodeByRowColumnIndex(FXMLDocumentController.java:111) 
at systemesolaire.FXMLDocumentController.calculer(FXMLDocumentController.java:81) 
... 58 more 

这里就是我intialize我的孩子(我用SceneBuilder所以这里是FXML文件)

<content> 
     <GridPane fx:id="gridApp" prefHeight="141.0" prefWidth="452.0"> 
      <columnConstraints> 
       <ColumnConstraints hgrow="SOMETIMES" maxWidth="226.0" minWidth="10.0" prefWidth="226.0" /> 
       <ColumnConstraints hgrow="SOMETIMES" maxWidth="146.0" minWidth="10.0" prefWidth="123.0" /> 
       <ColumnConstraints hgrow="SOMETIMES" maxWidth="113.0" minWidth="10.0" prefWidth="103.0" /> 
      </columnConstraints> 
      <rowConstraints> 
       <RowConstraints minHeight="40.0" prefHeight="40.0" vgrow="NEVER" /> 
       <RowConstraints minHeight="40.0" prefHeight="40.0" vgrow="NEVER" /> 
       <RowConstraints minHeight="40.0" prefHeight="40.0" vgrow="NEVER" /> 
      </rowConstraints> 
      <children> 
       <Label text=" Nom de l'appareil"> 
       <font> 
        <Font name="Anke" size="18.0" /> 
       </font> 
       </Label> 
       <Label text="Ampérage" GridPane.columnIndex="1"> 
       <font> 
        <Font name="Anke" size="14.0" /> 
       </font> 
       </Label> 
       <Label text="Heures utilisation" GridPane.columnIndex="2"> 
       <font> 
        <Font name="Anke" size="13.0" /> 
       </font> 
       </Label> 
       <TextArea prefHeight="200.0" prefWidth="200.0" promptText="Nom" GridPane.rowIndex="1" /> 
       <TextArea prefHeight="200.0" prefWidth="200.0" promptText="Amp" GridPane.columnIndex="1" GridPane.rowIndex="1" /> 
       <TextArea prefHeight="200.0" prefWidth="200.0" promptText="Heure" GridPane.columnIndex="2" GridPane.rowIndex="1" /> 
       <TextArea prefHeight="200.0" prefWidth="200.0" promptText="Nom" GridPane.rowIndex="2" /> 
       <TextArea prefHeight="200.0" prefWidth="200.0" promptText="Amp" GridPane.columnIndex="1" GridPane.rowIndex="2" /> 
       <TextArea prefHeight="200.0" prefWidth="200.0" promptText="Heure" GridPane.columnIndex="2" GridPane.rowIndex="2" /> 
      </children> 
     </GridPane> 
    </content> 

这里是我如何添加一行到我的gridPane

@FXML 
private void ajouteRangee(ActionEvent event) 
{ 

    TextArea nom = new TextArea(); 
    TextArea amp = new TextArea(); 
    TextArea heure = new TextArea(); 



    nom.setPromptText("Nom"); 
    amp.setPromptText("Amp"); 
    heure.setPromptText("heure"); 


    gridApp.addRow(rangee, nom, amp, heure); 
    gridApp.layout(); 
    rangee++; 

} 
+0

我们需要堆栈跟踪知道了什么错误......(在哪里如何初始化组件?在哪里添加组件到GridPane ...)我假设这是给NullPointer去那个孩子哈从未被初始化。 – GOXR3PLUS

+0

可能重复[什么是NullPointerException,以及如何解决它?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it ) – fabian

+0

我添加了堆栈跟踪 – MrDjEnjoy

回答

0

我在老师的帮助下得到了答案,如果有人有同样的问题,我就是这样解决的。

NullPointerException来的getColumnIndex,解决方案绕过这个问题,但我不知道为什么我第一次得到这个异常。

由于已知行和列的数量,因此不需要搜索每个节点的正确值。此外,由于每行儿童的数量相同,因此有一种合理的方式来获得特定的儿童。具体方法如下:

public TextArea getNodeByRowColumnIndex(final int row, final int column, GridPane gridPane) 
{ 

    ObservableList<Node> childrens = gridPane.getChildren(); 
    TextArea result = (TextArea) childrens.get((row*3)+column); 

    return result; 
} 

的ObservableList得到孩子从一排从左到右排,这样你就可以在列表中的特定对象与此公式(((的rowIndex + 1)*每行对象的数量)+在其列是你的对象)

然后,你可以通过执行获得文本区的文字:

stringTemp = getNodeByRowColumnIndex(i, 1, gridApp).getText();