Java 与荡秋千者的问题
我想让一个荡秋千的人去工作。 目前我有以下代码:Java 与荡秋千者的问题,java,image,swing,jlabel,swingworker,Java,Image,Swing,Jlabel,Swingworker,我想让一个荡秋千的人去工作。 目前我有以下代码: public class ImageWorker extends SwingWorker<Void, Void> implements KeyListener { private JLabel imageLabel; private ImageIcon basicImage; private ImageIcon whiteImage; public static void main(String[] args) {
public class ImageWorker extends SwingWorker<Void, Void> implements KeyListener
{
private JLabel imageLabel;
private ImageIcon basicImage;
private ImageIcon whiteImage;
public static void main(String[] args)
{
new ImageWorker();
}
public ImageWorker()
{
final JFrame frame = new JFrame();
imageLabel = new JLabel();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.getContentPane().add(imageLabel);
frame.setVisible(true);
try
{
basicImage = new ImageIcon(ImageIO.read(new File("src\\img\\basis1.jpg")).getScaledInstance(1024, 768, Image.SCALE_SMOOTH));
whiteImage = new ImageIcon(ImageIO.read(new File("src\\img\\wit.jpg")).getScaledInstance(1024, 768, Image.SCALE_SMOOTH));
}
catch(IOException ex)
{
ex.getMessage();
}
this.execute();
}
@Override
protected Void doInBackground()
{
try
{
while (true)
{
displayImage(basicImage);
Thread.sleep(1000L);
if(isCancelled())
return null;
}
}
catch(InterruptedException e)
{
e.getMessage();
}
return null;
}
private void displayImage(final Icon image)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
imageLabel.setIcon(image);
}
});
}
公共类ImageWorker扩展SwingWorker实现KeyListener
{
专用JLabel图像标签;
私有图像图标基本图像;
私有图像图标白色图像;
公共静态void main(字符串[]args)
{
新ImageWorker();
}
公共形象工作者()
{
最终JFrame=新JFrame();
imageLabel=新的JLabel();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。设置尺寸(400400);
frame.getContentPane().add(imageLabel);
frame.setVisible(true);
尝试
{
basicImage=newImageIcon(ImageIO.read(新文件(“src\\img\\basis1.jpg”)).getScaleInstance(1024768,Image.SCALE_SMOOTH));
whiteImage=newImageIcon(ImageIO.read(新文件(“src\\img\\wit.jpg”)).getScaledInstance(1024768,Image.SCALE_SMOOTH));
}
捕获(IOEX异常)
{
例如getMessage();
}
这是execute();
}
@凌驾
受保护的Void doInBackground()
{
尝试
{
while(true)
{
显示图像(基本图像);
睡眠(1000L);
如果(isCancelled())
返回null;
}
}
捕捉(中断异常e)
{
e、 getMessage();
}
返回null;
}
私有void显示图像(最终图标图像)
{
SwingUtilities.invokeLater(新的Runnable()
{
公开募捐
{
imageLabel.setIcon(图像);
}
});
}
我原以为图像会出现在JLabel中,但我只看到JFrame弹出。文件加载正确。我在另一个设置中测试了这一点。
任何指针?一个
SwingWorker
不适合您的情况查看swing包中的计时器。下面是API的链接:
您需要运行计时器,并每秒更改一个图像,因为这正是您所需要的
此外,每当出现异常时,至少打印出stacktrace或消息。否则,您将不知道是否发生了异常并被捕获。下面是一个使用计时器的示例,而不是使用SwingWorker
,这确实不适合您的情况。请注意,它与您现有的没有太大区别ng代码
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;
public class ImageWorker implements KeyListener
{
private JLabel imageLabel;
private ImageIcon basicImage;
private ImageIcon whiteImage;
private boolean isBasic = true;
private int delay = 1000; //milliseconds
private Timer timer;
public static void main(String[] args)
{
new ImageWorker();
}
public ImageWorker()
{
final JFrame frame = new JFrame();
imageLabel = new JLabel();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.getContentPane().add(imageLabel);
frame.setVisible(true);
try
{
basicImage = new ImageIcon(ImageIO.read(new File("src\\img\\basis1.jpg")).getScaledInstance(1024, 768, Image.SCALE_SMOOTH));
whiteImage = new ImageIcon(ImageIO.read(new File("src\\img\\wit.jpg")).getScaledInstance(1024, 768, Image.SCALE_SMOOTH));
}
catch (IOException ex)
{
ex.getMessage();
ex.printStackTrace();
}
frame.addKeyListener(this);
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if(isBasic) {
//display basic image
imageLabel.setIcon(basicImage);
}
else {
//display white image
imageLabel.setIcon(whiteImage);
}
//toggle the flag
isBasic = !isBasic;
}
};
//use a timer instead of SwingWorker
timer = new Timer(delay, taskPerformer);
timer.start();
}
@Override
public void keyPressed(KeyEvent e)
{
//key pressed, we want to stop toggling so stop the timer
timer.stop();
//do whatever else you were doing to set the value for isCancelled();
}
@Override
public void keyReleased(KeyEvent e)
{
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e)
{
// TODO Auto-generated method stub
}
}
你到底在做什么,需要一个SwingWorker
?它用于在后台做一些密集的事情,但希望结果显示在UI中,因此需要在事件调度线程中做一些事情,比如通过网络加载图像。在这里,你看起来像是只是不断地显示图像。也许如果你解释你想要实现什么,你会得到一个好的答案。我没有做任何有意义的事情,我只是尝试在一个JLabel上交替一些图像,直到用户按下一个键。但由于我不是程序员,我不知道从哪里开始。有人告诉我,SwingWorker是一个容易开始的地方,s因为效率和好的代码都不重要。这是我正在学习的某门课程的一次性演示(显然与CS无关).我在找quick n dirty hehe,好的,那很有帮助。让我再重复一遍。但是一个骗子是否杀伤力过大并不重要。如果它能完成任务,它就能完成任务。编辑:干杯:)@ZedLep一个骗子和欺诈行为的混合体。invokeLater方法非常不寻常。SwingWorker的重点是它提供了在t上运行的方法他使用EDT,防止您需要调用invokeLater等操作。@jzd setIcon会触发重新绘制还是需要显式调用?我不太清楚。我仍然需要能够通过按一个键取消运行,我知道怎么做。但我没有时间(也不希望)为了学习Java的基本原理,我已经和这个骗子共事了几个小时,但运气不好。不管我有没有过火,我都想继续下去,所以问题就来了。@ZedLep,你在浪费时间和这个骗子混在一起,使用计时器。保留一个对它的引用,需要时你可以取消它。@gcooney,给repain打电话。@gcooneyt可能是必需的,但真正的问题是SwingWorker不需要根据时间间隔重复操作,这正是计时器的设计目的和应该使用的内容。好的,我将对此进行研究:)您可能遇到的最棘手的问题之一是您应该执行任何与GUI相关的操作(更改大小、颜色等)如果使用普通计时器(java.util.timer
),超时事件将不会触发GUI线程中的回调,这对于Swing应用程序来说是有问题的。这就是为什么,如果您注意到,我们希望使用javax.Swing.Timer
,它将在GUI线程中回调,以便您可以安全地执行GUI操作。另外,请注意,您的原始代码确实对我起到了作用-至少到了我可以做到的程度我会看到一个图像。因此,如果您仍然有问题,可能是您为图像提供的路径有问题。一个更好、更便携的方法是。哇,这正是我想要的:)根据我的需要,我可以很容易地将此更改为taylor。非常感谢!!!@ZedLep-很高兴它有所帮助!不过我做了两个小编辑;我忘记注册密钥侦听器(frame.addKeyListener(this);
)因此,原始代码不会停止切换图像。我还添加了对#printStackTrace()
的调用,该调用将显示异常的stacktrace,以便您可以轻松调试。是的,我想:)无论如何谢谢=)看到我昨天启动了Java(当我们决定进行此特定实验时)我们明天就要做实验了我没做得太糟我想呵呵