Java 使用new关键字从同一包内的类外部调用框架时,在框架内获取null textarea

Java 使用new关键字从同一包内的类外部调用框架时,在框架内获取null textarea,java,swing,jframe,jtextarea,Java,Swing,Jframe,Jtextarea,我用板条箱装了一个框架,里面有一个面板,面板里面有一个文本区域。现在,我创建了一个构造器,使框架在一段时间内可见,然后将其设置为不可见。在它可见的时间内,它会显示一些消息 当我在outputDisplay类的main方法中运行构造函数代码时,它会显示文本消息 但是当我使用新的outputDisplayString ip在其他类中调用它时,int time只显示框架,但里面没有文本 import java.awt.BorderLayout; import java.awt.Color; impo

我用板条箱装了一个框架,里面有一个面板,面板里面有一个文本区域。现在,我创建了一个构造器,使框架在一段时间内可见,然后将其设置为不可见。在它可见的时间内,它会显示一些消息

当我在outputDisplay类的main方法中运行构造函数代码时,它会显示文本消息 但是当我使用新的outputDisplayString ip在其他类中调用它时,int time只显示框架,但里面没有文本

import java.awt.BorderLayout; 
import java.awt.Color;
import java.awt.Font;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class OutputDisplay {

JFrame frame;
JPanel  panel;
JTextArea area;
Font font;

    OutputDisplay(String ip,int time) throws InterruptedException{
    frame = new JFrame("Warning");
    frame.setLocation(400, 220);
    panel = new JPanel();
    area = new JTextArea();
    font = new Font("Aharoni", Font.BOLD, 16);
    area.setFont(font);
    area.setForeground(Color.RED);
    area.setSize(200, 200);
    int j=0;
    String[] t = {ip}; 
    for(int i=0;i<t.length;i++){
        area.append(t[i]+"\n");
    }//for
    //area.setText(ip);
    panel.add(area);
    panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));
    frame.getContentPane().add(BorderLayout.CENTER, panel);
    frame.pack();
    frame.setSize(600, 200);
    frame.setVisible(true);
    Thread.sleep(time);
    j++;
    if(j==1){
        frame.setVisible(false);
    }//if
    frame.setResizable(false);
    }//constructor
 }//Class

答案是,第二种方式是,您在UI线程上运行它。因此,当您进行睡眠调用时,gui中不会显示任何内容,因为您已将gui置于睡眠状态。解决方案是使用javax.swing.Timer


。。。不想大喊大叫,只想强调问题的根源。答案是,第二种方法是,您在UI线程上运行这个。因此,当您进行睡眠调用时,gui中不会显示任何内容,因为您已将gui置于睡眠状态。解决方案是使用javax.swing.Timer

。。。不想大喊大叫,只想突出问题的根源

Thread.sleeptime;不要这样做,因为你挡住了EDT

当我在outputDisplay类的main方法中运行构造函数代码时,它会显示文本消息

你可能在做什么

public static void main (String[] args) {
    new OutputDisplay();
}
这不是在事件分派线程上运行的,而是错误的。如果你在EDT上运行它,就像你应该看到的那样,它将不起作用

public static void main (String[] args) {
    SwingUtilities.invokeLater(new Runnable(){
        new OutputDisplay();                     <==== Create on EDT
    });                                                WON'T WORK!!
}
但是当我使用新的outputDisplayString ip在其他类中调用它时,int time只显示框架,但里面没有文本

无论是否在事件线程上启动应用程序,所有组件事件都会在此线程上分派,因此当您按下按钮尝试打开新帧时,这就是在EDT上创建帧。与使用SwingUtilities单独运行OutputDisplay时出现的问题相同。invokeLater

Thread.sleeptime;不要这样做,因为你挡住了EDT

当我在outputDisplay类的main方法中运行构造函数代码时,它会显示文本消息

你可能在做什么

public static void main (String[] args) {
    new OutputDisplay();
}
这不是在事件分派线程上运行的,而是错误的。如果你在EDT上运行它,就像你应该看到的那样,它将不起作用

public static void main (String[] args) {
    SwingUtilities.invokeLater(new Runnable(){
        new OutputDisplay();                     <==== Create on EDT
    });                                                WON'T WORK!!
}
但是当我使用新的outputDisplayString ip在其他类中调用它时,int time只显示框架,但里面没有文本


无论是否在事件线程上启动应用程序,所有组件事件都会在此线程上分派,因此当您按下按钮尝试打开新帧时,这就是在EDT上创建帧。与使用SwingUtilities单独运行OutputDisplay时出现的问题相同。invokeLater

先生,您能给我一个示例代码来指导我如何操作吗。我自己尝试过,但没能做到,所以我给了你示例代码。在frame.setVisibletrue之后取出所有内容;先生,您能给我一个示例代码来指导我怎么做吗。我自己尝试过,但没能做到,所以我给了你示例代码。在frame.setVisibletrue之后取出所有内容;先生,您能给我一个示例代码来指导我怎么做吗。我自己试过,但没能做到,所以你能给我一个示例代码,可以指导我怎么做吗。我自己试过,但没有成功