【问题标题】:I'm not able to see images in my Java image viewer我无法在我的 Java 图像查看器中看到图像
【发布时间】:2018-06-11 15:12:57
【问题描述】:

我正在尝试用 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) contentPane.setLayout(null); Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上使用不同语言环境中的不同 PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them 以及white space 的布局填充和边框。 2) 例如,获取图像的一种方法是热链接到在this Q&A 中看到的图像。
  • 3) “我的程序所做的是它接受用户的两个输入,在输入 1 中用户输入文件夹的路径” 哦,为了爱用户,给他们一个JFileChooser。 1970 年代的文本字段。
  • 我可以使用 'JFileChooser' 制作一个与此相同的程序,但现在我想通过这种方法来做同样的事情。所以,我需要你在同一件事上的帮助,但事情的运作方式没有改变。
  • “所以,我需要你在同样的事情上没有任何变化的帮助......”为了我的帮助,你需要使用我在第 2 点中提到的示例图像) 制作一个minimal reproducible example。我不会费心编译上面看到的代码,更不用说帮助了。把问题简单化。您不必更改实际程序,但是(为了我的帮助)您需要更改示例代码。一旦我们解决了问题,您就应该能够将更改调整为您喜欢的任何损坏的代码(例如没有布局)。
  • @AndrewThompson 在删除 contentPane.setLayout(null) 语句时仍然无法获得所需的结果。

标签: java arrays image swing methods


【解决方案1】:

如果您打印正在使用的文件名,您会看到它们是基本文件名,没有目录。这意味着它们是相对文件名,它们是否存在完全取决于Java进程本身的当前目录。

java.io.File 是一个过时的类。你应该避免使用它。相反,请使用java.nio.file package,它不仅会返回完整的文件路径,还会在您尝试列出文件失败时为您提供有用的信息。替换这两个事件:

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);
}

【讨论】:

  • 是否应该同时更改 getImage() 和 showImage() 方法中的出现?
  • 是的,这就是我所说的“两种情况”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多