简体   繁体   中英

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

What I'm wondering is how I can append text to my console (JTextArea) from other classes.

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):

static JTextArea console;

Here is how the add method is call and where it throws the 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);

to

console.setEditable(true);

and a NullPointerException was still thrown. 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. 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. 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. 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

You're declaring console twice. 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; to private JTextArea console; and 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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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