将文本(从文件中读取)转换为JFrame

时间:2012-11-27 13:30:20

标签: java text jframe

编写Java非常新,所以感谢我能得到的任何帮助。

我正在尝试创建带有文本的JFrame,从单独的文本文件中读取(有5个段落,每个段落一个接一个出现)。我需要帮助使文本出现在JFrame上(现在不用担心延迟效果),因为到目前为止还没有成功。下面的代码我是否远远不够?我知道这是一个常见的问题,但其他线程一直在处理事件和其他(对我而言)困难的想法,从这些代码中获取我需要的东西对我来说仍然是一个挑战。

我已经读过我需要一个JLabel来继续文本(虽然在其他地方我读过JPanel?)。我相信我还需要一个方法来显示StoryFrame类中的文本,我可以在其中添加JLabel(并可能声明nextLine命令以帮助创建延迟效果,而不是将其放入我的ShowIntro类中 - 我打算反复重复这个过程)。 cmd还让我意识到我从一个静态的地方调用了一个非静态的方法 - 尝试查看我的Java for Dummies文本,但仍然无法弄清楚如何解决这个问题。我知道这段代码不够,我错过了什么?

import javax.swing.JFrame;
import javax.swing.JLabel;

public class StoryFrame extends JFrame {
        public StoryFrame() {
        setTitle("見張ってしながら...");
        setSize(400,500);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public void displayText() {
        JLabel Text = new JLabel();
        add(Text); // I feel I need to add a lot more here to connect the two classes

        }
}


import java.util.Scanner;
import java.io.File;
import java.io.IOException;

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

    new StoryFrame();
    Scanner reader = new Scanner(new File("Intro.txt"));

    while (reader.hasNext()) {
    StoryFrame.displayText();       
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {      
        }
    }
 }
}

3 个答案:

答案 0 :(得分:0)

首先,你的displayText()不是静态方法,因此你不能从静态方法调用非静态方法,这是静态方法,而不是在类的对象上调用它。

你需要这样的东西:

StoryFrame sf = new StoryFrame();
sf.displayText();

否则,如果你这样做:

StoryFrame.displayText();

编译器希望displayText是一个静态方法,它不是。

不要试图使displayText()成为静态方法,因为当你从displayText调用非静态方法时会产生新的问题。所以只需创建一个StoryFrame对象并在其上调用displayText()。

另外一条建议,不要用于傻瓜书,它们没用。 我推荐用于学习Java的一本好书叫做Big Java。它会教你很多东西。

同样@schippi提到你的displayText()方法需要一个参数,该参数将是你添加到JLabel的文本。

答案 1 :(得分:0)

JPanel只是其他组件的容器。 JLabel可以包含文本。 您想要将文本添加到JLabel。

你需要一个JLabel作为Objectvariable,你可以在框架的构造函数中添加它并将其添加到框架中

private JLabel mylabel;
public StoryFrame() {
    setTitle("見張ってしながら...");
    setSize(400,500);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    mylabel=new JLabel();
    this.add(mylabel);
    setVisible(true);
}

现在你想要扫描仪的文本,这是由

完成的
reader.next()

然后你想要改变标签的文字。

mylabel.setText(text);

追加你可以的东西

mylabel.setText(mylabel.getText()+text);

我希望你能为自己解决剩下的问题

提示:您的displaytext方法需要一个参数

答案 2 :(得分:0)

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

    new StoryFrame();
    Scanner reader = new Scanner(new File("Intro.txt"));

    while (reader.hasNext()) {
        StoryFrame.displayText(); // 1 & 2     
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {      
        }
    }
 }
}

在查看ShowIntro课程时,我注意到两件奇怪的事情:

  1. 您正在课堂上调用非静态方法(displayText())。
  2. 您没有将扫描程序读取的内容传递给该方法调用。
  3. 要修复(1),您应该将StoryFrame类的实例传递给变量,并将StoryFrame替换为标记行中此变量的名称。
    要修复(2),您应该向方法displayText()添加一个参数,因此将StoryFrame类中该方法的标题替换为public void displayText(String text) {,并在调用方法时传递扫描程序读取的文本ShowIntro班。

    更正版本(未经测试)

    class ShowIntro {
     public static void main(String args[]) 
                    throws IOException {
    
        StoryFrame frame = new StoryFrame();                  // Store the StoryFrame in a variable
        Scanner reader = new Scanner(new File("Intro.txt"));
    
        while (reader.hasNext()) {
            frame.displayText(reader.next());               // pass the text read by the scanner to the displayText() method
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {      
            }
        }
     }
    }
    

    来自StoryFrame类的displayText()方法:

    public void displayText(String text) {       // One parameter: a String
        JLabel Text = new JLabel(text);          // Use the String; make it the content of the JLabel
        add(Text);                               // Now add the JLabel to the JFrame.
    }