Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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 与荡秋千者的问题_Java_Image_Swing_Jlabel_Swingworker - Fatal编程技术网

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(当我们决定进行此特定实验时)我们明天就要做实验了我没做得太糟我想呵呵