【问题标题】:How to set visibility of this frame in Java如何在 Java 中设置此框架的可见性
【发布时间】:2016-06-30 23:52:29
【问题描述】:

我有一个名为 FiHaStart 的框架。 它必须自行关闭并传递另一个名为 NewPlayer 的帧。 框架 NewPlayer 已打开,但框架 FiHaStart 仍然存在(未关闭)。 我能做什么?

import javax.swing.*;
import java.awt.*;
import java.util.Timer;
import java.util.TimerTask;

public class FiHaStart extends JFrame {
 JFrame start;
 JLabel gif;
 JPanel p1;

 Timer timer;

public  FiHaStart(int seconds){     // We have a gif on the frame it takes 7 seconds
    timer = new Timer();            //The frame will be closed after 7 seconds
    timer.schedule(new RemindTask(), seconds*1000);

}

//问题大概就在这里。

 class RemindTask extends TimerTask{
    public void run(){
         setVisible(false);

         timer.cancel();
         new NewPlayer();
    }
 }

public FiHaStart() {

  // JLabel backGround = new JLabel(new ImageIcon("images\\new.png"));
  setTitle("FiHa");
  setSize(750, 550);
  setLocationRelativeTo(null); // Center the frame
  // getContentPane().add(backGround);
  setLayout(null);

  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setVisible(true);
  setResizable(false);

  setContentPane(new JLabel(new ImageIcon("images\\new.png")));

  setIconImage(Toolkit.getDefaultToolkit().getImage("images\\iconfh.png"));

    gif = new JLabel("");
    ImageIcon ikon=new ImageIcon("images\\giff.gif");
    gif.setIcon(ikon);
    gif.setBounds( 210, 350 , 319,36);
    this.add(gif);

    revalidate();
    repaint();

    new FiHaStart(7);
   }
}

【问题讨论】:

  • 我无法将此框架的可见性设置为 false。 ://
  • 发布最小示例。所有的 gif 代码都是无关紧要的

标签: java swing user-interface timer frame


【解决方案1】:

为什么在默认构造函数的末尾调用new FiHaStart(7)?基本上,您同时创建了两个 FiHaStart 实例。

为什么不直接启动RemindTask 而不是在默认构造函数中调用new FiHaStart(7)。比如:

   public FiHaStart() {
       // other code
       timer = new Timer();            
       timer.schedule(new RemindTask(), 7*1000);
   }

您应该看看如何组织您的 java 类构造函数。通常对于您的默认构造函数,编译器会自动插入超类的默认构造函数,或者您使用superthis,而不是new 从同一类或超类显式调用构造函数。

此外,您将构造函数 FiHaStart(double seconds) 设为公共,而没有初始化实例内的变量。

您的代码中的另一个问题是它使用了java.util.Timer。对于与 Swing 组件交互的调度任务,您应该使用javax.swing.TimerHere 是一篇讨论过堆栈溢出的帖子。

【讨论】:

    【解决方案2】:

    您必须模拟单击框架的 x 按钮。尝试这个 : yourframe.dispatchEvent(new WindowEvent(yourframe, WindowEvent.WINDOW_CLOSING));

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多