2

对编写 Java 非常陌生,因此非常感谢我能得到的任何帮助。

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

我已经读过我需要一个 JLabel 才能继续文本(尽管我在其他地方读过 JPanel?)。我相信我还需要一种在 StoryFrame 类中显示文本的方法,我可以在其中添加 JLabel(并可能说明 nextLine 命令以帮助创建延迟效果,而不是将其放入我的 ShowIntro 类中 - 我打算重复这个过程)。cmd 还让我意识到我从静态位置调用了一个非静态方法 - 尝试在我的 Java 中查找 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) {      
        }
    }
 }
}
4

3 回答 3

1
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. 您不会将扫描仪读取的内容传递给该方法调用。

要修复 (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) {      
        }
    }
 }
}

displayText()StoryFrame 类中的方法:

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.
}
于 2012-11-27T13:47:04.060 回答
0

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

你需要这样的东西:

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

否则,如果您这样做:

StoryFrame.displayText();

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

不要尝试将 displayText() 设为静态方法,因为这会在您从 displayText 调用非静态方法时产生新问题。因此,只需创建一个 StoryFrame 对象并在其上调用 displayText()。

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

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

于 2012-11-27T13:39:49.233 回答
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 方法需要一个参数

于 2012-11-27T13:43:53.680 回答