我试图在我的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。非常感谢你的帮助!

最佳答案

由于您在构造函数中重新声明了控制台变量,因此您的代码使控制台变量变得无影无踪。不要这样
该静态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变量,类中的实例字段将保持为空。您不应在构造函数中重新声明变量,就像这样:

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

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




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

08-16 19:03