调度JFrame的重复处理

时间:2014-04-04 22:30:54

标签: java swing

在ActionListener中,我将图像添加到JPanel,然后弹出。在特定时间之后将处理JFrame。

这就是我的mainFrame类:

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;


public class mainFrame {
    JFileChooser chooser = new JFileChooser();
    File[] files;
    FileFilter filter = new FileNameExtensionFilter("Bilder", "gif", "png","jpg");

    private JFrame frame;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    mainFrame window = new mainFrame();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public mainFrame() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 300, 119);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        JButton btnStart = new JButton("Start !");
        btnStart.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                try{
                    final imageFrame imageFrame = new imageFrame();
                    imageFrame.getContentPane().add(new JLabel(new ImageIcon(files[0].getAbsolutePath())));
                    imageFrame.setVisible(true);
                    new Timer().schedule(new TimerTask() {
                        public void run() {
                                imageFrame.dispose();
                            }
                    }, (Integer) 3000);
                }catch(Exception e){
                    e.printStackTrace();
                }

            }
        });
        btnStart.setBounds(6, 62, 117, 29);
        frame.getContentPane().add(btnStart);

        JButton btnChooseFiles = new JButton("Choose Files !");
        btnChooseFiles.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                /* JFileChooser deklarieren */
                chooser = new JFileChooser();
                chooser.setMultiSelectionEnabled(true);
                chooser.addChoosableFileFilter(filter);
                chooser.showOpenDialog(null);

                /* FileList erstellen */
                files = chooser.getSelectedFiles();

                /* Displaying String containing chosen files */
                String fileList = "";
                for (int i = 0; i < files.length; i++) {
                    fileList += files[i].getName() + "\n";
                }
                System.out.println("Chosen Files:\n" + fileList);
            }
        });
        btnChooseFiles.setBounds(6, 6, 117, 29);
        frame.getContentPane().add(btnChooseFiles);
    }
}

这就是我的imageFrame的样子:

import java.awt.BorderLayout;


public class imageFrame extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    imageFrame frame = new imageFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public imageFrame() {
        setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        setBounds(100, 100, 623, 472);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
    }

}

到目前为止,一切都适用于一个文件,但我得到的是一个文件的列表,所以我决定使用for循环包装mainFrame中的try-catch块& #34;开始&#34; -ActionListener,遗憾的是它不起作用,因为除了最后一个图像之外的每个图像都会立即弹出,只有最后一个图像代表计时器的延迟。

总而言之,我只想在特定时间之后更改imageFrame对象内的图像。让我们说每隔3秒钟,窗格内的图片就会改变,直到我们通过所有选择的文件。

1 个答案:

答案 0 :(得分:0)

以下是您可以考虑的一些想法。

  • 保留一个currentIndex变量,可用于确定下一张图片的索引

  • 使用javax.swing.Timer代替java.util.Timer。您可以在How to Use Swing Timers查看更多信息。基本结构很容易记下。

    Timer (int delayInMillis, ActionListener listener)
    

    正如您所看到的那样delayInMillis是延迟,listener是每个延迟时间点触发的每个定时器事件的监听,并带有正常的actionPerformed回调。在actionPerformed中,您可以使用currentIndex来获取图片,然后增加currentIndex。就像是。您可以在需要时启动timer.start()。您也可以使用timer.setDelay(int)

    private int currentIndex = 0;
    private int delay = 2000;
    ...
    Timer timer = new Timer(delay, new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            if (current index is equal to array size) {
                ((Timer)e.getSource()).stop();
                MyDialog.this.dispose();
            } else {
                showImageByIndex(currentIndex);
                currentIndex++;
            }
        }
    });
    

    这只是一个例子,试着玩它。

  • 您还会注意到MyDialog。如果您需要使用多个帧,最好使用JDialog。因此,请尝试使用JDialog

  • 进行处理
  • 此外,您应该创建图像并将其保存在内存中,而不是每次打勾都创建新图像。另外,只需保留一个 JLabel,然后使用label.setIcon(imageArray[currentIndex]);


你可以做一些事情。尝试并解决它。如果您遇到问题,请询问或更新您的帖子。