【问题标题】:How Read from Text File to JLabel or JTextArea?如何从文本文件读取到 JLabel 或 JTextArea?
【发布时间】:2016-04-06 13:34:34
【问题描述】:

我正在尝试创建一个类似这样的弹出窗口:

玩过的游戏数:2
总分:10
平均分:5

我将数字 2、10 和 5 存储在一个文本文件中。我只想能够将文本文件中的数字读入(这就是我感到困惑的地方)JLabel 或 JTextArea?我还希望能够清除分数并将它们全部重置为 0。我认为这应该不会太难,但我可能是错的。当我读入这些数字时,我应该将它们存储到一个 ArrayList 中吗?

这是我目前的代码:

import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.Scanner;

public class HistoryPopUp {

    JFrame history;
    JPanel panel;
    JLabel numGames, totalScore, avgScore;
    JTextArea games,score,aScore;
    JButton clearHistory;

    HistoryPopUp(){
        history = new JFrame();
        panel = new JPanel(new GridLayout(3, 1));
        numGames = new JLabel("Number of Games Played: ");
        totalScore = new JLabel("Total Score: ");
        avgScore = new JLabel("Average Score: ");
        games = new JTextArea();
        score = new JTextArea();
        aScore = new JTextArea();


        clearHistory = new JButton();

        try {
            String textLine;
            FileReader fr = new FileReader("history.txt");
            BufferedReader reader = new BufferedReader(fr);
            while((textLine=reader.readLine()) != null){
                textLine = reader.readLine();
                games.read(reader,"Something");
                score.read(reader, "seomthing");
                aScore.read(reader,"balh");
            }

            reader.close();

        }catch(IOException ex){
                System.out.println("ABORT! YOU KILLED IT!!");
            }

        history.pack();
        history.setVisible(true);

        panel.add(games);
        panel.add(score);
        panel.add(aScore);

        JOptionPane.showMessageDialog(null, panel, "History of Games Played", JOptionPane.PLAIN_MESSAGE);

    }
}

编辑:格式化

【问题讨论】:

    标签: java swing text-files jlabel jtextarea


    【解决方案1】:

    您遇到的问题是您有 4 段代码都试图从同一个数据池中读取,scoreaScore 不太可能在阅读器中有任何数据可以读取一次 games已经结束了

    如果你只想使用JLabels,你可以这样做......

    String[] headers = {"Number of Games Played:", "Total Score:", "Average Score:"};
    JLabel[] labels = new JLabel[3];
    for (int index = 0; index < labels.length; index++) {
        labels[index] = new JLabel();
        // Add label to screen
    }
    
    try (BufferedReader br = new BufferedReader(new FileReader(new File("history.txt")))) {
        String text = null;
        int lineCount = 0;
        while ((text = br.readLine()) != null && lineCount < 3) {
            System.out.println(text);
            labels[lineCount].setText(headers[lineCount] + " " + text);
            lineCount++;
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    

    如果你想使用JTextArea,你可以这样做......

    String[] headers = {"Number of Games Played:", "Total Score:", "Average Score:"};
    JTextArea textArea = new JTextArea(3, 20);
    // Add text area to container
    
    try (BufferedReader br = new BufferedReader(new FileReader(new File("history.txt")))) {
        String text = null;
        int lineCount = 0;
        while ((text = br.readLine()) != null && lineCount < 3) {
            System.out.println(text);
            textArea.append(headers[lineCount] + " " + text + "\n");
            lineCount++;
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    

    您也可以以类似的方式使用JTextFields 数组

    【讨论】:

    • 感谢您的帮助!那么在屏幕上添加标签,是不是和 panel.add(insert label here) 一样?我会检查并命名存储到数组中的每个新 JLabel 吗?
    • @Sailanarmo 是的,添加多个标签与添加任何组件相同,您基本上已经完成了。不,你不会“命名”标签,它们包含在一个数组中,所以你需要通过这个数组来寻址,例如add(labels[index])。这是基本的 Java 101,如果您对此不熟悉,我建议您先回到基础,然后再处理 GUI 编程这样复杂的事情
    • 没关系,我想通了,它比我想象的要简单得多。谢谢您的帮助!这让我对它的工作原理有了新的认识!
    • @mKorbel 我认为是这样,但该数据不是 OP 想要显示的格式
    • @MadProgrammer JTable 没有 JTableHeader,单元格周围没有线条
    【解决方案2】:

    不要那样做。

    不要将“持久性”(信息保存在文件中)与“演示”混为一谈。

    相反;阅读 Swing 文档模型;或使用"model view controller" 方法。

    但是,从您编写的代码来看……您似乎仍然在使用 Swing UI 的非常基本的元素时遇到问题。关键是:有javadoc;以及来自 Oracle 的优秀教程。不要指望其他人会向你详细解释如何使用它们。我说的是:先学会如何使用各种UI元素;逐个;了解您如何将数据输入其中;以及该信息将如何显示。

    然后,当您了解 UI 元素时;考虑一种合理的方式来解除您的数据;并将其放入您的 UI 元素中(如前所述:在同一段代码中执行所有这些操作是糟糕的设计;应该避免)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      相关资源
      最近更新 更多