编写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) {
}
}
}
}
答案 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
课程时,我注意到两件奇怪的事情:
displayText()
)。要修复(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.
}