从 Gui class 从另一个 class 调用打印文本方法
Calling printText method from Gui class from anoter class
我正在尝试在我的 GUI 中实现一个单例 class 但是一旦我 return 它给了我一个 nullpointer 异常的实例,我一直在寻找多个来源,但它不能正常工作.
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.SwingUtilities;
import java.util.concurrent.TimeUnit;
/**
* Write a description of class GUI here.
*/
public class GUI extends JFrame
{
JFrame frame = new JFrame("VoidWorld");
JTextArea textarea = new JTextArea(10, 45);
JScrollPane scrollPane = new JScrollPane(textarea);
JTextArea textAreaSide = new JTextArea(10, 15);
JScrollPane scrollPaneSide = new JScrollPane(textAreaSide);
JTextField textfield = new JTextField("", 5);
Color bgcolor = new Color(255, 255, 255);
private static GUI instance;
Parser command;
/**
* Constructor for objects of class GUI
*/
private GUI()
{
command = new Parser();
textarea.setEditable(false);
frame.setSize(900,400);
frame.add(scrollPaneSide, BorderLayout.CENTER);
textAreaSide.setFont(new Font("Helvetica", Font.PLAIN, 20));
textAreaSide.setForeground(Color.red);
textAreaSide.setBorder(BorderFactory.createLineBorder(Color.white));
textAreaSide.setBackground(bgcolor);
textAreaSide.setLineWrap(true);
frame.add(scrollPane, BorderLayout.WEST);
textarea.setFont(new Font("Helvetica", Font.PLAIN, 20));
textarea.setForeground(Color.black);
textarea.setBorder(BorderFactory.createLineBorder(Color.white));
textarea.setBackground(bgcolor);
textarea.setLineWrap(true);
frame.add(textfield, BorderLayout.PAGE_END);
textfield.setFont(new Font("Helvetica", Font.PLAIN, 30));
textfield.setForeground(Color.black);
textfield.setBorder(BorderFactory.createLineBorder(Color.white));
textfield.setBackground(bgcolor);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//frame.pack();
frame.setVisible(true);
frame.setResizable(false);
textfield.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
printIfTextFieldIsActivated(evt);
}
});
}
public void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new GUI();
}
});
}
private void printIfTextFieldIsActivated(java.awt.event.KeyEvent evt) {
if(evt.getKeyCode() == KeyEvent.VK_ENTER) {
String commandString = textfield.getText().toString();
String output = command.parseCommand(commandString);
printAppend(output);
textfield.setText("");
}
}
public static GUI getInstance() {
if(instance == null){
instance = new GUI();
}
return instance;
}
}
当我从另一个 class 调用 getInstance 时,它会给我一个 Whosebug,因为实例总是空的,我知道我的 GUI class 已创建,因为我可以看到 Gui。
谢谢,
p.s。抱歉代码乱七八糟,我不是这方面的专家..
我想到了几件事:
需要通过getInstance()
方法实例化GUI
:
public void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new GUI() // <-- NO
GUI.getInstance(); // <-- YES
}
});
}
您可能正在从不同的线程访问 instance
字段。如果是这样,将其标记为 volatile
可能会有所帮助。像这样:private static volatile GUI instance;
您可能在 GUI
构造函数中触发了一个侦听器,它试图在构造函数完成之前通过 GUI.getInstance()
获取实例。
我正在尝试在我的 GUI 中实现一个单例 class 但是一旦我 return 它给了我一个 nullpointer 异常的实例,我一直在寻找多个来源,但它不能正常工作.
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.SwingUtilities;
import java.util.concurrent.TimeUnit;
/**
* Write a description of class GUI here.
*/
public class GUI extends JFrame
{
JFrame frame = new JFrame("VoidWorld");
JTextArea textarea = new JTextArea(10, 45);
JScrollPane scrollPane = new JScrollPane(textarea);
JTextArea textAreaSide = new JTextArea(10, 15);
JScrollPane scrollPaneSide = new JScrollPane(textAreaSide);
JTextField textfield = new JTextField("", 5);
Color bgcolor = new Color(255, 255, 255);
private static GUI instance;
Parser command;
/**
* Constructor for objects of class GUI
*/
private GUI()
{
command = new Parser();
textarea.setEditable(false);
frame.setSize(900,400);
frame.add(scrollPaneSide, BorderLayout.CENTER);
textAreaSide.setFont(new Font("Helvetica", Font.PLAIN, 20));
textAreaSide.setForeground(Color.red);
textAreaSide.setBorder(BorderFactory.createLineBorder(Color.white));
textAreaSide.setBackground(bgcolor);
textAreaSide.setLineWrap(true);
frame.add(scrollPane, BorderLayout.WEST);
textarea.setFont(new Font("Helvetica", Font.PLAIN, 20));
textarea.setForeground(Color.black);
textarea.setBorder(BorderFactory.createLineBorder(Color.white));
textarea.setBackground(bgcolor);
textarea.setLineWrap(true);
frame.add(textfield, BorderLayout.PAGE_END);
textfield.setFont(new Font("Helvetica", Font.PLAIN, 30));
textfield.setForeground(Color.black);
textfield.setBorder(BorderFactory.createLineBorder(Color.white));
textfield.setBackground(bgcolor);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//frame.pack();
frame.setVisible(true);
frame.setResizable(false);
textfield.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
printIfTextFieldIsActivated(evt);
}
});
}
public void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new GUI();
}
});
}
private void printIfTextFieldIsActivated(java.awt.event.KeyEvent evt) {
if(evt.getKeyCode() == KeyEvent.VK_ENTER) {
String commandString = textfield.getText().toString();
String output = command.parseCommand(commandString);
printAppend(output);
textfield.setText("");
}
}
public static GUI getInstance() {
if(instance == null){
instance = new GUI();
}
return instance;
}
}
当我从另一个 class 调用 getInstance 时,它会给我一个 Whosebug,因为实例总是空的,我知道我的 GUI class 已创建,因为我可以看到 Gui。
谢谢,
p.s。抱歉代码乱七八糟,我不是这方面的专家..
我想到了几件事:
需要通过
getInstance()
方法实例化GUI
:public void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new GUI() // <-- NO GUI.getInstance(); // <-- YES } }); }
您可能正在从不同的线程访问
instance
字段。如果是这样,将其标记为volatile
可能会有所帮助。像这样:private static volatile GUI instance;
您可能在
GUI
构造函数中触发了一个侦听器,它试图在构造函数完成之前通过GUI.getInstance()
获取实例。