Java 计时器事件在更改JPanel之前运行
我有一个JFrame,其中包含一个带有JButton“Press Me”的JPanel 按下“Press me”(按我)按钮将在同一JFrame内切换到另一个JPanel(第二面板) 我面临的问题是,在第二个面板出现之前,当我按下“press Me”(按我)按钮时,会有10秒的延迟 此10秒延迟是由计时器事件引起的 我希望第二个面板在计时器事件开始之前出现 现在发生的是计时器事件开始,我在“按下我”按钮等待10秒钟,然后第二个面板出现 有人能帮我解决这个问题吗 谢谢 用于运行项目的主类Java 计时器事件在更改JPanel之前运行,java,swing,debugging,timer,jpanel,Java,Swing,Debugging,Timer,Jpanel,我有一个JFrame,其中包含一个带有JButton“Press Me”的JPanel 按下“Press me”(按我)按钮将在同一JFrame内切换到另一个JPanel(第二面板) 我面临的问题是,在第二个面板出现之前,当我按下“press Me”(按我)按钮时,会有10秒的延迟 此10秒延迟是由计时器事件引起的 我希望第二个面板在计时器事件开始之前出现 现在发生的是计时器事件开始,我在“按下我”按钮等待10秒钟,然后第二个面板出现 有人能帮我解决这个问题吗 谢谢 用于运行项目的主类 pa
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;
}
登录面板类
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;
}
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;
}
第二面板类
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;
}
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更新。如果删除睡眠,您应该会看到第二个面板在计时器启动之前出现。您正在用thread.sleep(7000)
阻塞SecondPanel.run()
中的Swing事件线程。这将停止任何GUI更新。如果删除睡眠,您应该会看到第二个面板在计时器启动之前出现。您正在用thread.sleep(7000)
阻塞SecondPanel.run()
中的Swing事件线程。这将停止任何GUI更新。如果删除睡眠,您应该会看到第二个面板在计时器启动之前出现。您正在用thread.sleep(7000)
阻塞SecondPanel.run()
中的Swing事件线程。这将停止任何GUI更新。如果您取消睡眠,您应该会看到第二个面板在计时器启动之前出现。有两个错误。计时器是从run()和第二个开始初始化的。被线程杀死。Sleeputility是无用的类使用CardLayout,更好的是使用JLabel。setIcon(我的本地变量在应用程序启动时初始化)Scaled instalne非常异步,带有,必须计算可能的延迟(没有绘制图标,只有鼠标悬停在重新绘制正确的图像上)@mKorbel,在run
方法中创建Timer
有什么问题?另外,调用Thread.sleep
不会“杀死”计时器,它仍然会在另一个线程上运行,或者这不是你的意思?我同意使用CardLayout
会更好,但这不是@Computernerd问题的原因。@SimonC的想法是错误的,可能会产生副作用(run()中的所有内容都会导致死亡……)有两个错误。计时器是从run()和第二个开始初始化的。被线程杀死。Sleeputility是无用的类使用CardLayout,更好的是使用JLabel。setIcon(我的本地变量在应用程序启动时初始化)Scaled instalne非常异步,带有,必须计算可能的延迟(没有绘制图标,只有鼠标悬停在重新绘制正确的图像上)@mKorbel,在run
方法中创建Timer
有什么问题?另外,调用Thread.sleep
不会“杀死”计时器,它仍然会在另一个线程上运行,或者这不是你的意思?我同意使用CardLayout
会更好,但这不是@Computernerd问题的原因。@SimonC的想法是错误的,可能会产生副作用(run()中的所有内容都会导致死亡……)有两个错误。计时器是从run()和第二个开始初始化的。被线程杀死。Sleeputility是无用的类使用CardLayout,更好的是使用JLabel。setIcon(我的本地变量在应用程序启动时初始化)Scaled instalne非常异步,带有,必须计算可能的延迟(没有绘制图标,只有鼠标悬停在重新绘制正确的图像上)@mKorbel,在run
方法中创建Timer
有什么问题?另外,调用Thread.sleep
不会“杀死”计时器,它仍然会在另一个线程上运行,或者这不是你的意思?我同意使用CardLayout
会更好,但这不是@Computernerd问题的原因。@SimonC的想法是错误的,可能会产生副作用(run()中的所有内容都会导致死亡……)有两个错误。计时器是从run()和第二个开始初始化的。被线程杀死。Sleeputility是无用的类使用CardLayout,更好的是使用JLabel。setIcon(我的本地变量在应用程序启动时初始化)Scaled instalne非常异步,带有,必须计算可能的延迟(没有绘制图标,只有鼠标悬停在重新绘制正确的图像上)@mKorbel,在run
方法中创建Timer
有什么问题?另外,调用Thread.sleep
不会“杀死”计时器,它仍然会在另一个线程上运行,或者这不是你的意思?我同意使用CardLayout
会更好,但这并不是@Computernerd问题的原因。@SimonC的想法是错误的,可能会产生副作用(run()中的所有内容都会导致死亡……)