Java 如何将导入的文本文件读入JFrame

Java 如何将导入的文本文件读入JFrame,java,jframe,Java,Jframe,因此,我希望我导入的名为“Instructions.txt”的文本文件被添加到JFrame中,以便玩家查看他/她是否选择查看指令。我可以在屏幕的最左边显示一个单词,但没有其他单词。此外,如果我通过拖动窗口的一侧来调整窗口的大小,则在左侧第一个单词的顶部会显示多个单词。有什么想法吗 //Battleship.java import javax.swing.*; import java.awt.*; import java.util.Scanner; import java.io.*; impo

因此,我希望我导入的名为“Instructions.txt”的文本文件被添加到JFrame中,以便玩家查看他/她是否选择查看指令。我可以在屏幕的最左边显示一个单词,但没有其他单词。此外,如果我通过拖动窗口的一侧来调整窗口的大小,则在左侧第一个单词的顶部会显示多个单词。有什么想法吗

 //Battleship.java

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

public class Battleship
{
 public static void main (String[] args) throws IOException
{
String name = JOptionPane.showInputDialog("What is your name?");

    String answer = JOptionPane.showInputDialog("Welcome to Battleship, "+name+". Would you         like to see a set of instructions?");

if(answer.equals ("yes") || answer.equals ("Yes"))
{
TextFrame textframe = new TextFrame();
  textframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  Scanner scan = new Scanner (new File("Instructions.txt"));

  while (scan.hasNext())
  {
    textframe.displayText(scan.next());

  }

JFrame frame = new JFrame("Battleship");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Buttons b = new Buttons();

JPanel panel = new JPanel();
panel.add(b);
panel.setBackground(Color.blue);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

frame.getContentPane().add (panel);
frame.pack();
frame.setVisible(true);
}

else
{    
JFrame frame = new JFrame("Battleship");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Buttons b = new Buttons();

JPanel panel = new JPanel();
panel.add(b);
panel.setBackground(Color.blue);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

frame.getContentPane().add (panel);
frame.pack();
frame.setVisible(true);
}

 }

 }

 //TextFrame.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.JLabel;

 public class TextFrame extends JFrame 
 {

    public TextFrame() 
{

    setTitle("Instructions");
    setSize(400,500);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
}

public void displayText(String text) 
{       
JLabel Text = new JLabel(text);          
add(Text);                               
 }
 }

有一些组件将为您处理此问题。从这里开始:


在调用一个方法来显示它的每个标记之前,也许您应该先阅读整个
“Instructions.txt”
文件。声明一个变量,将文件内容写入其中,然后显示它。正如前面的答案所示,JLabel不是显示一堆文本的最佳组件。

目前,您正在为文本文件的每一行添加一个新的
JLabel
。所有这些
JLabel
都添加到机架的中心区域,替换以前添加的所有组件。因此,您看到的唯一单词是文件中的最后一个单词。您可以使用以下代码修复此问题:

Scanner scan = new Scanner (new File("Instructions.txt"));
StringBuilder sb = new StringBuilder();

while (scan.hasNext()) {
    sb.append(scan.next());
}

textframe.displayText(sb.toString());
要在
JLabel
中显示长文本,我还需要将文本包装在html标记中:

public void displayText(String text) {       
    JLabel lblText = new JLabel("<html><body>" + text + "</body></html>");          
    add(lblText);                             
}
public void displayText(字符串文本){
JLabel lblText=新的JLabel(“+text+”);
添加(lblText);
}

此外,我建议使用
BufferedReader
读取您的文件。老实说,我从来没有使用过扫描仪来读取文本文件,我不确定这是否是一种好的做法。这里可以找到一个例子:

我用JTextArea更新了您的代码。我把它们都放在一个文件中,所以我删除了一些导入。你应该修复这些项目

import java.util.Scanner;
import java.io.*;
import javax.swing.JOptionPane;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Battleship {

    public static void main(String[] args) throws IOException {

        String name = JOptionPane.showInputDialog("What is your name?");

        String answer = JOptionPane.showInputDialog("Welcome to Battleship, " + name + ". Would you         like to see a set of instructions?");

        if (answer.equals("yes") || answer.equals("Yes")) {
            TextFrame textframe = new TextFrame();
            JTextArea jta = new JTextArea();
            jta.setEditable(false);
            jta.setLineWrap(true);
            jta.setWrapStyleWord(true);
            textframe.add(jta);
            textframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            Scanner scan = new Scanner(new File("Instructions.txt"));

            StringBuilder sb = new StringBuilder();
            while (scan.hasNextLine()) {
                String line = scan.nextLine();
                jta.append(line);

            }

            JFrame frame = new JFrame("Battleship");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

           // Buttons b = new Buttons();

            JPanel panel = new JPanel();
           // panel.add(b);
            panel.setBackground(Color.blue);
            panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

            frame.getContentPane().add(panel);
            frame.pack();
            frame.setVisible(true);
        } else {
            JFrame frame = new JFrame("Battleship");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            //Buttons b = new Buttons();

            JPanel panel = new JPanel();
          //  panel.add(b);
            panel.setBackground(Color.blue);
            panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

            frame.getContentPane().add(panel);
            frame.pack();
            frame.setVisible(true);
        }

    }

}

  class TextFrame extends JFrame {

    public TextFrame() {

        setTitle("Instructions");
        setSize(400, 500);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void displayText(String text) {
        JLabel Text = new JLabel(text);
        add(Text);
    }
}

我不明白为什么这一点被否决。虽然这只是到官方文档的一般链接,没有直接的编码帮助,但这些文档是相关的,有助于回答问题,符合SO规则。