Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 始终使按钮在JFrame上可见_Java_Swing_User Interface - Fatal编程技术网

Java 始终使按钮在JFrame上可见

Java 始终使按钮在JFrame上可见,java,swing,user-interface,Java,Swing,User Interface,我的程序符合并显示一个空白框。我尝试了多种方法,但我认为这应该有效,我不明白为什么不行? 代码很简单,它只显示一个空白框和一个按钮,通知用户操作侦听器正在工作 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Udemy { public Udemy() { JFrame f = new JFrame(); f.setTitle("La's Frame");

我的程序符合并显示一个空白框。我尝试了多种方法,但我认为这应该有效,我不明白为什么不行?
代码很简单,它只显示一个空白框和一个按钮,通知用户操作侦听器正在工作

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Udemy {

  public Udemy() {
    JFrame f = new JFrame();
    f.setTitle("La's Frame");
    f.setSize(400,400);
    f.setVisible(true);
    f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);

    JPanel panel = new JPanel();
    f.getContentPane().add(panel);

    JButton b1 = new JButton("Click me");
    panel.add(b1);
    b1.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e){
        System.out.println("Action Listener is working");
      }
    });
  }

  public static void main(String[] args){
    Udemy ud = new Udemy();
  }
}

在这里,我移动了
f.setVisible(true)到底部,一切正常

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Udemy {

public Udemy(){
JFrame f = new JFrame();
f.setTitle("La's Frame");
f.setSize(400,400);
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);


JPanel panel = new JPanel();
f.getContentPane().add(panel);

JButton b1 = new JButton("Click me");
panel.add(b1);
f.setVisible(true);

b1.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent e){
     System.out.println("Action Listener is working");
     }
   });
 }

 public static void main(String[] args){
     Udemy ud = new Udemy();

      }
   }

您没有打包框架,也没有在EDT上启动GUI。或者在逻辑上缩进代码,但这不会影响代码是否可靠工作,只取决于代码的易读性,以及可能提供了多少帮助。另外,在添加所有组件之前,不要将框架设置为可见,并且
pack()
已按照@cricket_007的建议调用。在ui建立后最后调用setVisible,或者重新验证并重新绘制容器。您应该这样做:根据代码,@MadProgrammer的可能副本按钮不可见,现在是我对了吗?按钮始终可见,只是没有渲染,Swing很懒,通常,在您告诉它之前,它不会更新ui,移动setVisible只会延迟ui应该显示的时间,因此ui必须在该点进行布局和绘制。您可以通过调用revalidate来触发布局过程,也可以通过重新绘制来触发绘制过程,通常一起执行