java - 每次我向网格 Pane 添加一行时,它都会显示 IllegalArgumentException

标签 java file-io gridpane

我正在尝试解决这个问题并用谷歌搜索了很多。但我什么也没找到。

这是我第一次在 StackOverflow 上提问。

如果我无法正确解释我的问题,请耐心等待。

如有任何帮助,我们将不胜感激。

这是我的代码:

package Main_Game;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

import Models.character;
import Models.gameObject;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class leaderBoard
{
    private static int id = 0;

    leaderBoard()
    {
        //Stage created
        Stage primaryStage = new Stage();

        //root pane
        BorderPane root = new BorderPane();

        GridPane gridPane = new GridPane();
        gridPane.setHgap(5);

        //grid pane for top header
        GridPane gridHeader = new GridPane();
        gridHeader.setHgap(140);

        root.setMargin(gridHeader, new Insets(30,0,0,0));

        //scene created with borderpane as root
        Scene scene = new Scene(root,1200,700);

        //setting background of whole scene
        final String BACKGROUND = "-fx-background-color: #2A2927;";

        //setting style of header
        final String HEADER_STYLE = "-fx-font-family: 'Bungee Shade';"
                + "-fx-font-size: 40;";

        final String TEXT_STYLE = "-fx-font-size: 25;"
                + "-fx-font-family:  'Calibri';";

        root.setStyle(BACKGROUND);

        //Header for rank text
        Text rankHeader = new Text();
        rankHeader.setText("Rank#");
        rankHeader.setFill(Color.YELLOW);
        rankHeader.setStyle(HEADER_STYLE);

        //Header for name text
        Text nameHeader = new Text();
        nameHeader.setText("Name");
        nameHeader.setFill(Color.YELLOW);
        nameHeader.setStyle(HEADER_STYLE);

        //header for score text
        Text scoreHeader = new Text();
        scoreHeader.setText("Score");
        scoreHeader.setFill(Color.YELLOW);
        scoreHeader.setStyle(HEADER_STYLE);

        //
        Text rank = new Text();
        rank.setStyle(TEXT_STYLE);
        rank.setFill(Color.WHITE);

        Text name = new Text();
        name.setStyle(TEXT_STYLE);
        name.setFill(Color.WHITE);

        Text score = new Text();
        score.setStyle(TEXT_STYLE);
        score.setFill(Color.WHITE);

        //totalScore variable gets total score from another java file
        String totalScore = Integer.toString(gameObject.getTotalScore());

        //playerName variable gets character's name from another java file
        String playerName = character.getName();

        //Using BufferedWriter to write playerName and totalScore in a text file
        BufferedWriter bw = null;

        try
        {
            File file = new File("score.txt");

            //if file does not exit it will create a new file
            if(!file.exists())
            {
                file.createNewFile();
            }

            FileWriter fw = new FileWriter(file,true);
            bw = new BufferedWriter(fw);


            /*Want to increment ID everytime file gets written but that's not main concern for now
             * 
             * file gets written with playerName and totalScore 
             * 
             * I have used \t to create space between ID, name and score
             */

            bw.write(id++ + "\t\t\t\t\t\t\t\t" + playerName + "\t\t\t\t\t\t\t" + totalScore);


            //After every line....another line starts with new line
            bw.newLine();

            bw.flush();
            bw.close();

        }
        catch(IOException e)
        {
            e.printStackTrace();
        }

        /*
         * Using BufferedReader to read from file and outputting it in my scene
         */

        BufferedReader br = null;

        try
        {
            FileReader fr = new FileReader("score.txt");
            br = new BufferedReader(fr);


            String line;
            while((line = br.readLine()) != null)
            {
                //Splitting words so that I can print out ID, Name and Score
                //If i don't use split it just prints out score...because score gets written at last in file
                String[] words = line.split(",");
                for(int i =0; i<words.length; i++)
                {
                    name.setText(words[i]);

                    /*
                     * HERE IS THE PROBLEM
                     * Every time it reads line from text file
                     * I add it to gridPane below Header
                     * but i want to add rows dynamically but i get illegalArgumentException
                     */
                    gridPane.add(name,2,1);
                }
            }


            br.close();

        }
        catch(IOException e)
        {
            e.printStackTrace();
        }


        /*
         * IGNORE THIS PART
         * I tried using Scanner but it won't work
         */

//      Scanner sc = null;
//      try 
//      {
//          File file = new File("score.txt");
//          sc = new Scanner(file);
//      }
//      catch(IOException e)
//      {
//          e.printStackTrace();
//      }
//      
//      while(sc.hasNextLine())
//      {
//          Scanner sc2 = new Scanner(sc.nextLine());
//          while(sc2.hasNext())
//          {
//              String s = sc2.next();
//              score.setText(s);
//          }
//      }

        gridHeader.add(rankHeader, 0, 0);
        gridHeader.add(nameHeader, 1, 0);
        gridHeader.add(scoreHeader, 2, 0);

        root.setTop(gridHeader);
        root.setCenter(gridPane);

        primaryStage.setScene(scene);
        primaryStage.setTitle("Basket Bud");
        primaryStage.show();
    }
}

最佳答案

您多次使用添加同一对象。也就是说,您要向 Pane 中添加相同的“名称”变量,这在 Javafx 中是不可以的,更好的方法是

ArrayList<Text> myText = new ArrayList<Text>();  
try
        {
            FileReader fr = new FileReader("score.txt");
            br = new BufferedReader(fr);


            String line;

            while((line = br.readLine()) != null)
            {
                //Splitting words so that I can print out ID, Name and Score
                //If i don't use split it just prints out score...because score gets written at last in file
                String[] words = line.split(",");

                for(int i =0; i<words.length; i++)
                {
Text temp = new Text();
                    temp.setText(words[i]);
temp.setStyle(TEXT_STYLE);
        temp.setFill(Color.WHITE);
myText.add(temp) //allows you to edit these later 
                    /*
                     * HERE IS THE PROBLEM
                     * Every time it reads line from text file
                     * I add it to gridPane below Header
                     * but i want to add rows dynamically but i get illegalArgumentException
                     */
                    gridPane.add(temp,2,i+1);
                }
            }


            br.close();

        }

抱歉,在手机上无法实现糟糕的缩进

如果这不起作用,请告诉我

关于java - 每次我向网格 Pane 添加一行时,它都会显示 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49847516/

相关文章:

c - 终止进程时是否可以删除文件?

c - 打开多个文件并将它们存储在结构数组中

javafx - 从 GridPane 中删除一行

java/groovy 套接字写入超时

java - Xtext - 内容提案匹配上下文缩进

python - 选择要写入的 .txt 文件中的行数

css - 使用 CSS 在 javaFX 中旋转 GridPane

Java:从 wsdl 获取示例请求 XML

java - java中的正则表达式忽略

java - 如何在 JavaFX GUI 中显示二维数组的元素