【发布时间】:2016-02-22 08:16:57
【问题描述】:
我正在尝试用 Java 制作幻灯片程序。可悲的是,图像没有出现在窗口中。不知道为什么……
我所知道的是一切运行顺利,没有发生错误(堆栈跟踪)。窗口出现,那里没有图像。
public class Slideshow implements ActionListener, Runnable {
private ArrayList<String> haveUsed = new ArrayList<>();
private JFrame settingsFrame, imageFrame;
private JTextField rootFolder, timeFrame, hiddenRootFolder, hiddenTimeFrame;
private JButton startSlideShow, addRootFolder;
private JLabel jLabel = null;
private ImageIcon imageIcon = null;
public void openSettingsFrame() {
settingsFrame = new JFrame("Settings - Slideshow v1.0");
settingsFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
settingsFrame.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
settingsFrame.setSize(400, 400);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(0, 0, 5, 0);
hiddenRootFolder = new JTextField("Root Folder:");
hiddenRootFolder.setEditable(false);
hiddenRootFolder.setBackground(settingsFrame.getBackground());
hiddenRootFolder.setBorder(BorderFactory.createLineBorder(settingsFrame.getBackground()));
settingsFrame.add(hiddenRootFolder, gbc);
gbc.gridx = 1;
rootFolder = new JTextField("", 15);
gbc.insets = new Insets(0, 0, 0, 5);
rootFolder.setBackground(new Color(255, 255, 255));
rootFolder.setEditable(false);
//TODO: add mouse listener
settingsFrame.add(rootFolder, gbc);
gbc.gridx = 2;
addRootFolder = new JButton("Add");
addRootFolder.addActionListener(this);
addRootFolder.setSize(80, 20);
addRootFolder.setPreferredSize(new Dimension(60, 20));
addRootFolder.setMinimumSize(new Dimension(60, 20));
settingsFrame.add(addRootFolder, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
hiddenTimeFrame = new JTextField("Speed sec.:");
gbc.insets = new Insets(0, 0, 5, 0);
hiddenTimeFrame.setBorder(BorderFactory.createLineBorder(settingsFrame.getBackground()));
hiddenTimeFrame.setBackground(settingsFrame.getBackground());
hiddenTimeFrame.setEditable(false);
settingsFrame.add(hiddenTimeFrame, gbc);
gbc.gridx = 1;
timeFrame = new JTextField("", 15);
settingsFrame.add(timeFrame, gbc);
gbc.gridx = 0;
gbc.gridy = 2;
startSlideShow = new JButton("Start Slideshow");
startSlideShow.addActionListener(this);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridwidth = 3;
settingsFrame.add(startSlideShow, gbc);
settingsFrame.setVisible(true);
}
public static void main(String[] args) {
new Slideshow().openSettingsFrame();
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == addRootFolder) {
JFileChooser jfc = new JFileChooser("");
jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = jfc.showOpenDialog(addRootFolder);
if(returnVal == JFileChooser.APPROVE_OPTION) {
File f = jfc.getSelectedFile();
rootFolder.setText(f.getPath());
}
} else if(e.getSource() == startSlideShow) {
if(!rootFolder.getText().equals("")) {
if(!timeFrame.getText().equals("")) {
try {
int time = Integer.parseInt(timeFrame.getText());
openImageWindow(time);
} catch (NumberFormatException ex) {
ex.printStackTrace();
}
}
} else {
//TODO: prompt
}
}
}
@Override
public void run() {
File file = new File(rootFolder.getText());
List list = Arrays.asList(file.list());
Random random = new Random();
int i = random.nextInt(list.size());
while(haveUsed.contains(list.get(i).toString()) || !list.get(i).toString().endsWith(".jpg") ||
!list.get(i).toString().endsWith(".bmp") || !list.get(i).toString().endsWith(".png")) {
i = random.nextInt(list.size());
}
imageIcon = new ImageIcon(list.get(i).toString());
imageFrame.repaint();
imageFrame.revalidate();
haveUsed.add(list.get(i).toString());
}
public void openImageWindow(int delay) {
imageFrame = new JFrame("Slideshow v1.0");
imageFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
imageFrame.setLayout(new BorderLayout());
imageFrame.setSize(400, 400);
File file = new File(rootFolder.getText());
List list = Arrays.asList(file.list());
Random random = new Random();
int i = random.nextInt(list.size());
imageIcon = new ImageIcon(list.get(i).toString());
haveUsed.add(list.get(i).toString());
jLabel = new JLabel(imageIcon);
jLabel.setSize(399, 399);
imageFrame.add(jLabel);
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
scheduledExecutorService.scheduleWithFixedDelay(this, delay, delay, TimeUnit.SECONDS);
imageFrame.setVisible(true);
}
【问题讨论】:
-
不要使用
ExecutorService,而是使用 SwingTimer,因为当您想要更新 UI 时使用它是安全的 -
@MadProgrammer 我已经接受了你的建议,但这并不能解决我的问题。但是感谢您的提示!
-
我认为这不是“最佳”解决方案,只是对其他潜在问题的补救
-
@MadProgrammer 抱歉,是的,我刚刚学会了评论和回答之间的区别。
-
别担心,当我第一次开始分析代码时,我的 cmets 往往是短而敏锐的,在我诊断和调试代码时寻找真正明显的东西 ;)