我试图在Java中制作幻灯片程序。可悲的是,图像没有出现在窗口中。不知道为什么...图像没有出现在JFrame中
我所知道的是一切运行顺利,没有发生错误(堆栈跟踪)。窗口出现,那里没有图像。
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',而是使用一个Swing'Timer',因为它是安全的,当你要更新UI – MadProgrammer
使用@MadProgrammer我已经接受了你的建议,但那不能解决我的问题。但是,谢谢你的提示! –
我不认为这将是“解决方案”,只是对其他潜在问题的补救 – MadProgrammer