在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秒钟,窗格内的图片就会改变,直到我们通过所有选择的文件。
答案 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]);
你可以做一些事情。尝试并解决它。如果您遇到问题,请询问或更新您的帖子。