Я не могу видеть изображения в своей программе просмотра изображений Java - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь сделать просмотрщик изображений в Java.Что делает моя программа, так это то, что она принимает два ввода от пользователя: на входе 1 пользователь вводит путь к папке, в которой он хочет просматривать изображения, а на входе 2 также пользователь вводит путь для другой папки, в которой он хочетдля просмотра изображений, а затем нажмите кнопку запуска.При нажатии кнопки запуска первое изображение из обеих введенных пользователем папок отображается в средстве просмотра изображений параллельно друг другу, и затем пользователь может просматривать следующее и предыдущее изображения при нажатии различных кнопок.Мой код для вышеуказанной программы показан ниже: -

import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

public class Main extends JFrame {

private JPanel contentPane;
public JTextField textField;
public JTextField textField_1;
public JLabel label;
public JLabel label_1;
int pos = 0;
int pos1 = 0;

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

/**
 * Create the frame.
 */
public Main() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 693, 421);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    JLabel lblInput = new JLabel("Input 1");
    lblInput.setFont(new Font("Tahoma", Font.PLAIN, 14));
    lblInput.setBounds(43, 26, 71, 29);
    contentPane.add(lblInput);

    textField = new JTextField();
    textField.setBounds(124, 26, 312, 29);
    contentPane.add(textField);
    textField.setColumns(10);



    JLabel lblExePath = new JLabel("Input 2");
    lblExePath.setFont(new Font("Tahoma", Font.PLAIN, 14));
    lblExePath.setBounds(43, 90, 71, 29);
    contentPane.add(lblExePath);

    textField_1 = new JTextField();
    textField_1.setColumns(10);
    textField_1.setBounds(124, 90, 312, 29);
    contentPane.add(textField_1);

    JButton btnRun = new JButton("Run");
    btnRun.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            showImage(0);
            showImages(0);

        }
    });
    btnRun.setBounds(505, 95, 89, 23);
    contentPane.add(btnRun);

    label = new JLabel("");
    label.setBounds(43, 151, 262, 176);
    contentPane.add(label);

    label_1 = new JLabel("");
    label_1.setBounds(332, 151, 262, 176);
    contentPane.add(label_1);

    JButton btnPrevious = new JButton("Previous");
    btnPrevious.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            pos = pos-1;
            if (pos < 0) {
                pos = 0;
            }
            showImage(pos);

            pos1 = pos1-1;
            if (pos1 < 0) {
                pos1 = 0;
            }
            showImages(pos1);
        }
    });
    btnPrevious.setBounds(124, 349, 89, 23);
    contentPane.add(btnPrevious);

    JButton btnNext = new JButton("Next");
    btnNext.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            pos = pos+1;
            if (pos >= getImage().length) {
                pos = getImage().length - 1;
            }
            showImage(pos);

            pos1 = pos1+1;
            if (pos1 >= getImages().length) {
                pos1 = getImages().length - 1;
            }
            showImage(pos1);
        }
    });
    btnNext.setBounds(331, 349, 89, 23);
    contentPane.add(btnNext);

}


public String[] getImage() {
    File file = new File(textField.getText());
    String[] imagesList = file.list();
    return imagesList;
} 

public void showImage(int index) {
    String[] imagesList = getImage();
    String imageName = imagesList[index];
    ImageIcon icon = new ImageIcon(imageName);
    Image image = icon.getImage().getScaledInstance(label.getWidth(), 
    label.getHeight(), Image.SCALE_SMOOTH);
    label.setIcon(new ImageIcon(image));
}

public String[] getImages() {
    File file = new File(textField_1.getText());
    String[] imagesList = file.list();
    return imagesList;
} 

public void showImages(int index) {
    String[] imagesList = getImages();
    String imageName = imagesList[index];
    ImageIcon icon = new ImageIcon(imageName);
    Image image = icon.getImage().getScaledInstance(label_1.getWidth(), 
    label_1.getHeight(), Image.SCALE_SMOOTH);
    label_1.setIcon(new ImageIcon(image));
 }

}

Теперь проблема, с которой я сталкиваюсь, заключается в том, что все работает нормально, я могу преобразовать файлы введенной папки пользователя всписок массивов в методе getimage () и возможность конвертировать их в другой массив, но я не могу правильно просмотреть этот массив в методе showimage () и не могу отобразить изображение на экране.И если есть какие-то другие проблемы в этом коде, пожалуйста, руководствуйтесь, потому что я новичок в программировании.

1 Ответ

0 голосов
/ 11 июня 2018

Если вы напечатаете имена файлов, которые вы используете, вы увидите, что они являются базовыми именами файлов без каталога.Это означает, что они являются относительными именами файлов, и их существование полностью зависит от текущего каталога самого процесса Java.

java.io.File - устаревший класс.Вы должны избегать его использования.Вместо этого используйте пакет java.nio.file , который не только возвратит полные пути к файлам, но и предоставит вам полезную информацию в случае неудачной попытки вывести список файлов.Замените оба вхождения этого:

String[] imagesList = file.list();

следующим:

String[] imagesList;
try (DirectoryStream<Path> dir = Files.newDirectoryStream(file.toPath())) {
    Collection<String> paths = new ArrayList<>();
    for (Path path : dir) {
        paths.add(path.toString());
    }
    imagesList = paths.toArray(new String[0]);
} catch (IOException e) {
    throw new RuntimeException("Cannot list files in " + file, e);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...