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