简体   繁体   English

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

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

I'm trying to put a console-type thing on my GUI and for that I'm pretty sure that I have to append text to the JTextArea. 我试图在我的GUI上放置一个控制台类型的东西,为此,我非常确定必须将文本追加到JTextArea。 For the console to actually be worthwhile I'll have to append text from a different class. 为了使控制台真正有价值,我将不得不添加来自其他类的文本。 For that I built a method to append a string to my console but it threw a NullPointerException and failed. 为此,我构建了一种将字符串追加到控制台的方法,但是该方法抛出NullPointerException并失败。

What I'm wondering is how I can append text to my console (JTextArea) from other classes. 我想知道的是如何将其他类的文本追加到控制台(JTextArea)。

Here is my code: 这是我的代码:

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);
}

}

Here is the method for appending the text to the console: 这是将文本追加到控制台的方法:

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

Here is a part that you are really going to want to pay attention to (well, still pay attention to the append method): 这是您真正要注意的部分(嗯,仍然要注意append方法):

static JTextArea console;

Here is how the add method is call and where it throws the NullPointerException: 这是调用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

By the way I tried changing 顺便说一下我尝试改变

console.setEditable(false); console.setEditable(false);

to

console.setEditable(true); console.setEditable(true);

and a NullPointerException was still thrown. 并且仍然抛出NullPointerException。 Thanks so much for your help! 非常感谢你的帮助!

  1. Your code shadows the console variable since you re-declare it in the constructor. 由于您在构造函数中重新声明了控制台变量,因此您的代码使控制台变量变得无影无踪。 Don't do this. 不要这样
  2. That static add(String...) method should not be static. 该静态add(String...)方法不应是静态的。 Make it an instance method. 使其成为实例方法。

ie, you have 即,你有

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.
  }
}

By re-declaring the bar variable in the constructor, the instance field in the class remains null. 通过在构造函数中重新声明bar变量,该类中的instance字段保持为null。 You should not re-declare the variable in the constructor, like so: 您不应该在构造函数中重新声明变量,就像这样:

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

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

In fact none of the methods or fields you are using above should be static other than a main method and one or two supporting methods, that's it. 实际上,除了主要方法和一种或两种支持方法外,上面使用的方法或字段都不应该是静态的。

Don't use a static reference, it has no meaning. 不要使用static引用,它没有任何意义。 As stated in your last question, a component can only have a single parent, using static components prevents you from having more the once instance of the class, but this is just a single side effect 如上一个问题所述,一个组件只能有一个父级,使用static组件可以防止您拥有该类的一次实例,但这只是一个副作用。

You're declaring console twice. 您两次声明console Once as a static field... 曾经作为静态领域...

static JTextArea console;

Once as a local variable in the constructor... 曾经在构造函数中作为局部变量...

JTextArea console = new JTextArea(6, 40);

Change static JTextArea console; 更改static JTextArea console; to private JTextArea console; private JTextArea console; and console = new JTextArea(6, 40); console = new JTextArea(6, 40); , this way the instance field will actually be initialised and added to the UI as you expect it ,这样实例字段将被实际初始化并按预期添加到用户界面

Instead of using static , pass a reference of the GUI to whatever needs to append content. 无需使用static ,而是将GUI的引用传递给需要添加内容的任何内容。

Don't forget that Swing is a single threaded environment and all updates to the UI should be made from within the context of the Event Dispatching Theead 别忘了Swing是一个单线程环境,对UI的所有更新都应该在Event Dispatching Theead的上下文中进行。

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

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