0

我正在尝试编写一个程序,该程序将遍历大量图像并对它们应用各种操作,然后存储使用结果来训练自组织地图,我希望为该程序编写一个前端,用于我正在处理的每个图像它将显示原始图像,并在我对其应用操作后显示结果图像,到目前为止,我已经编写了一个 GUI,根据我的研究,它应该显示图像(我已经缩放,因为有些可能相当大(

这是我运行程序时得到的,我想要的是显示在“原始图像”标签下方的图像 图形用户界面的屏幕截图

这部分代码只是处理初始化,因为您可以看到一个面板被添加到框架中,所有程序都在这里。初始化面板时,运行以下代码,注意这是在 ImageComparatorPanel 类中

public ImageComparatorPanel() throws FileNotFoundException, UnsupportedEncodingException
{
    setLayout(new BorderLayout());

    origonalImage = new JLabel( new ImageIcon() );
    leftTitle = new JLabel("Origonal Image");
    rightTitle = new JLabel("Shrunken Image");

    ButtonListener listener = new ButtonListener();

    start = new JButton("Start!");
    start.addActionListener(listener);

    JPanel left = new JPanel();
    left.add(leftTitle);
    left.add(origonalImage);

    //add(leftTitle, BorderLayout.WEST);
    //add(origonalImage, BorderLayout.WEST);
    add(left, BorderLayout.WEST);
    add(rightTitle, BorderLayout.EAST);
    add(start, BorderLayout.NORTH);

    setPreferredSize(new Dimension(800,800));

}

在我的程序的主要部分(按下开始按钮时执行的位)应该更新图像的代码位如下

origonalImage.setIcon(getImage(imagePath));

getImage 函数打开图像并缩小它,以便它适合面板上的代码(我想我应该包括这个以防万一......

public ImageIcon getImage(String URL) throws IOException
{
    double scale = 0.5;

    File f = new File(URL);
    Image image = ImageIO.read(f);

    ImageIcon icon = new ImageIcon(image);
    int h = icon.getIconHeight();
    int w = icon.getIconWidth();

    Image newImg = icon.getImage();
    Image scaled = newImg.getScaledInstance((int)(w * scale), (int)(h * scale), Image.SCALE_SMOOTH);

    ImageIcon newIcon = new ImageIcon(scaled);

    return newIcon;
}

如何在 RUN 函数中循环的每次迭代中更改这一点,GUI 中显示的图像将被更新?

4

1 回答 1

1

你说:

如何在 RUN 函数中循环的每次迭代中更改这一点,GUI 中显示的图像将被更新?

要每 x 毫秒更改一次 GUI 的可见状态,您需要使用 Swing Timer 或后台线程,例如 SwingWorker。

如果您的代码被间歇性调用并没有长时间运行并且不会过度占用 Swing 事件线程(事件调度线程或 EDT),则将使用 Timer。如果定期调用的代码确实需要时间来运行,那么这种技术将占用 EDT,使您的 GUI 完全没有响应。在这种情况下,当您确实需要在图像更改之间进行大量处理时,请使用 SwingWorker,然后使用 SwingWorker 的发布/处理方法对来获取和显示更新的图像。正确创建的 SwingWorker 将在 EDT 的线程后台运行繁重的代码,但允许您在必要时在 EDT 上进行 Swing 调用。

如果您的主要问题只是没有显示图像,那么您将要解决这个错误:您不应该尝试在一个巨大的复杂程序中解决这个问题,而是创建一个仅尝试显示图像的小程序和没有其他的。以逐步的方式解决每个小子问题,只有在解决后,才能将其添加到更大的整体,即大程序中。

于 2013-05-03T14:30:20.137 回答