Java 使用new关键字从同一包内的类外部调用框架时,在框架内获取null textarea
我用板条箱装了一个框架,里面有一个面板,面板里面有一个文本区域。现在,我创建了一个构造器,使框架在一段时间内可见,然后将其设置为不可见。在它可见的时间内,它会显示一些消息 当我在outputDisplay类的main方法中运行构造函数代码时,它会显示文本消息 但是当我使用新的outputDisplayString ip在其他类中调用它时,int time只显示框架,但里面没有文本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
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时出现的问题相同。invokeLaterThread.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之后取出所有内容;先生,您能给我一个示例代码来指导我怎么做吗。我自己试过,但没能做到,所以你能给我一个示例代码,可以指导我怎么做吗。我自己试过,但没有成功