繁体   English   中英

如何将文本从另一个类追加到JTextArea?

[英]How do I append text to a JTextArea from another class?

我试图在我的GUI上放置一个控制台类型的东西,为此,我非常确定必须将文本追加到JTextArea。 为了使控制台真正有价值,我将不得不添加来自其他类的文本。 为此,我构建了一种将字符串追加到控制台的方法,但是该方法抛出NullPointerException并失败。

我想知道的是如何将其他类的文本追加到控制台(JTextArea)。

这是我的代码:

package com.robot;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;

public class GUI extends JFrame implements Runnable {

static JTextArea console;

//defines the line break
static String newline = System.getProperty("line.separator");

//start of the constructor method for GUI
public GUI() {

    //makes the program unable to be resized
    this.setResizable(false);

    //allows the user to close the program with the x button
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //sets the title of the program
    this.setTitle("ROBOT Alpha Alfred Version 3.0");

    //creates panels to hold the elements of the GUI
    JPanel mainPanel = new JPanel();
    JPanel buttonPanel = new JPanel();
    JPanel consolePanel = new JPanel();

    //creates buttons
    JButton runDemo = new JButton("Run Demo");
    JButton runLive = new JButton("Run Live");
    JButton scan = new JButton("Scan Market");
    JButton findPatterns = new JButton("Find Patterns");
    JButton cleanFolder = new JButton("Clean Up Folder");
    JButton configureSettings = new JButton("Configure Settings");

    //creates the console
    JTextArea console = new JTextArea(6, 40);

    //sets the default text of the console
    console.setText("----------------------- ROBOT Console -----------------------" + newline);

    //makes the console unable to be edited
    console.setEditable(false);

    //sets the line wrapping of the console
    console.setLineWrap(true);
    console.setWrapStyleWord(true);

    //creates scroll bars
    JScrollPane scrollBar = new JScrollPane(console);
    scrollBar.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    scrollBar.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);

    //adds buttons to the buttonPanel
    buttonPanel.add(runDemo);
    buttonPanel.add(runLive);
    buttonPanel.add(scan);
    buttonPanel.add(findPatterns);
    buttonPanel.add(cleanFolder);
    buttonPanel.add(configureSettings);

    //adds the console to the console panel
    consolePanel.add(scrollBar);

    //adds panels to the main panel
    mainPanel.add(buttonPanel);
    mainPanel.add(consolePanel);

    //adds the main panel to the frame
    this.add(mainPanel);

    //packs the GUI
    this.pack();

    //sizes the GUI
    this.setSize(600, 400);

    //centers the GUI
    this.setLocationRelativeTo(null);

    //sets the GUI to be visible
    this.setVisible(true);

}

public void run() {

}

public static void add(String string) {
    console.append(string + newline);
}

}

这是将文本追加到控制台的方法:

public static void add(String string) {
    console.append(string + newline);
}

这是您真正要注意的部分(嗯,仍然要注意append方法):

static JTextArea console;

这是调用add方法的方式以及它引发NullPointerException的位置:

//main method start
public static void main(String[] args) throws InterruptedException, IOException, AWTException {

    //opens up the GUI
    (new Thread(new GUI())).start();

    GUI.add("Text to add");

    //possible methods
    //ScanMarket.scanMarket(); //scans market for data
    //FindPattern("Images"); //finds pattern among images in image folder labeled Images

}//end of main method

顺便说一下我尝试改变

console.setEditable(false);

console.setEditable(true);

并且仍然抛出NullPointerException。 非常感谢你的帮助!

  1. 由于您在构造函数中重新声明了控制台变量,因此您的代码使控制台变量变得无影无踪。 不要这样
  2. 该静态add(String...)方法不应是静态的。 使其成为实例方法。

即,你有

class Foo {
  private Bar bar; // this guy is null

  public Foo() {
    Bar bar = new Bar(); // the class field is *still* null
                       // since this bar variable is local to the constructor only.
  }
}

通过在构造函数中重新声明bar变量,该类中的instance字段保持为null。 您不应该在构造函数中重新声明变量,就像这样:

class Foo {
  private Bar bar; // class field is null here

  public Foo() {
    bar = new Bar();  // now no longer null. *** note the difference
  }
}

实际上,除了主要方法和一种或两种支持方法外,上面使用的方法或字段都不应该是静态的。

不要使用static引用,它没有任何意义。 如上一个问题所述,一个组件只能有一个父级,使用static组件可以防止您拥有该类的一次实例,但这只是一个副作用。

您两次声明console 曾经作为静态领域...

static JTextArea console;

曾经在构造函数中作为局部变量...

JTextArea console = new JTextArea(6, 40);

更改static JTextArea console; private JTextArea console; console = new JTextArea(6, 40); ,这样实例字段将被实际初始化并按预期添加到用户界面

无需使用static ,而是将GUI的引用传递给需要添加内容的任何内容。

别忘了Swing是一个单线程环境,对UI的所有更新都应该在Event Dispatching Theead的上下文中进行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM