如何将文本附加到另一个类的JTextArea?

时间:2014-01-28 02:39:05

标签: java eclipse swing user-interface jtextarea

我正在尝试在我的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);
}

这是你真正想要注意的一部分(好吧,仍然要注意追加方法):

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(假);

console.setEditable(真);

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

2 个答案:

答案 0 :(得分:3)

  1. 您的代码会影响控制台变量,因为您在构造函数中重新声明它。不要这样做。
  2. 静态add(String...)方法不应该是静态的。使它成为一个实例方法。
  3. 即,你有

    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变量,类中的实例字段保持为null。你不应该在构造函数中重新声明变量,如下所示:

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

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

答案 1 :(得分:2)

不要使用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的上下文中进行