繁体   English   中英

计时器事件在更改JPanel之前运行

[英]Timer event runs before changing of JPanel

我有一个JFrame,其中包含带有JButton“ Press Me”的JPanel

在此处输入图片说明

按下“ Press me”按钮将更改为同一JFrame中的另一个JPanel(SecondPanel)

在此处输入图片说明

我遇到一个问题,当我在SecondPanel出现之前按“按我”按钮时有10秒的延迟。

这10秒的延迟是Timer事件引起的。

我希望SecondPanel出现在Timer事件开始之前。

现在发生的事情是Timer事件开始,在SecondPanel出现之前,我正在等待“ Press Me”按钮10秒钟,

有人可以帮我解决这个问题吗

谢谢

用于运行项目的主类

package testing;

import java.io.*;
import java.security.*;
import javax.xml.bind.DatatypeConverter;
import java.lang.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;


public class Testing extends JPanel 
{



    public static void main(String[] args) 
    {
        frame = new JFrame();
        LoginPanel lp = new LoginPanel();
        frame.add(lp);
        frame.pack();
        frame.validate();
        frame.setVisible(true);

    }

   static JFrame frame;
}

LoginPanel类

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

public class LoginPanel extends JPanel
{
    LoginPanel()
    {
        Loginbtn = new JButton("Press Me");
        Loginbtn.addActionListener(new LoginButtonListener());
        add(Loginbtn);


    }

     private class LoginButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {

            SecondPanel sp = new SecondPanel();
            Utility.ChangePanel(sp);
            sp.run();
        }
    }

    JButton Loginbtn;

}

SecondPanel类

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;


public class SecondPanel extends JPanel
{
    SecondPanel()
    {
        setLayout(new GridLayout(2,2));

        //set deck image
        File deckfile = new File("./src/testing/Ace_Club_1_1.png"); //deck image file location

        try
        {    
          Deckimg = ImageIO.read(deckfile); //read deck image


        }

        catch (IOException e)
        {

        }

         Image scaledInstance = Deckimg.getScaledInstance(100, -1, Image.SCALE_SMOOTH);
         DeckLabel = new JLabel(new ImageIcon(scaledInstance));
         add(DeckLabel);

    }

    public void run()
    {
        Timer timer = new Timer(5000, new ActionListener() 
        {
            @Override
            public void actionPerformed(ActionEvent arg0) 
            {
                // Code to be executed
                System.out.println("HowareYou");

            }
        });
        timer.setRepeats(false); // Only execute once
        timer.start(); // Go go go!

        try
        {
             Thread.sleep(7000);
        }



        catch(InterruptedException ie)
        {

        }

    }

    JLabel DeckLabel;
    JPanel DeckPanel;
    BufferedImage Deckimg;

}

用于在JFrame中切换JPanel的实用程序类

package testing;

import java.security.MessageDigest;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Utility 
{    
    public static void ChangePanel(JPanel jp)
    {


        testing.Testing.frame.getContentPane().removeAll();
        testing.Testing.frame.add(jp);
        testing.Testing.frame.validate();


    }

}

您正在使用Thread.sleep(7000)阻止SecondPanel.run()的Swing事件线程。 这将停止发生任何GUI更新。 如果您取消睡眠,则应该在计时器启动之前看到第二个面板。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM