1

我已经用 Java 编写了一个小程序,作为我的编程课程的一部分,它记录一个人的生日并找到他们出生的星期几。根据分配规范,我们也将把这个小程序放在我们的 Amazon EC2 虚拟服务器上。

现在,当从 JTable 中选择此人时,程序会获取他们的信息以及图像文件的路径,该图像文件也位于他们的信息旁边的 JTable 中。因此,例如,您可以选择包括:

| 约翰·多伊 | 17 | 02 | 2013 | /图像/约翰.jpg |

当我在本地机器上运行它时,一切都按预期工作 - 计算日期并显示图像。但是,当我将它放在我的服务器上时,会发生以下两种情况之一:

  1. 如果我将“显示日期”代码放在“显示图像”代码之前,那么当我按下“计算”按钮时,只显示文本而图像不显示。
  2. 如果我将“显示图像”代码放在“显示日期”代码之前,当我按下“计算”按钮时不会发生任何事情。

这里可能会发生什么?我的图像仍在“images/Name.jpg”路径中,我什至尝试使用整个路径(“ https://myUsername.course.ca/assignment/images/Name.jpg ”)。都不行!这种奇怪的行为会有什么明显的原因吗?

/**
 * Method that handles the user pressing the "Calculate" button
 */
private class btnCalculateHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        int result;

        name = (String)table.getValueAt(table.getSelectedRow(), 0);

        day = Integer.parseInt((String)table.getValueAt(table.getSelectedRow(), 1));
        month = Integer.parseInt((String)table.getValueAt(table.getSelectedRow(), 2));
        year = Integer.parseInt((String)table.getValueAt(table.getSelectedRow(), 3));

        result = calculateDayOfWeek(day, month, year);

        writeToFile();

        ImageIcon imgPerson = new javax.swing.ImageIcon((String)table.getValueAt(table.getSelectedRow(), 4));
        Image person = imgPerson.getImage();
        Image personResized = person.getScaledInstance(75, 100, java.awt.Image.SCALE_SMOOTH);
        ImageIcon imgPersonResized = new ImageIcon(personResized);
        image.setIcon(imgPersonResized);

        outputValue.setText(name + " was born on a " + days[result] + ".");
    }
}
4

1 回答 1

1

我看到的第一个问题是......

ImageIcon imgPerson = new javax.swing.ImageIcon((String)table.getValueAt(table.getSelectedRow(), 4))

ImageIcon(String)用于指定图像的文件名。这应该用于加载本地磁盘的图像,而不是网络路径。

If the images are loaded relative to the to the applet, you would use Applet#getImage(URL, String) passing it a reference of Applet#getDocumentBase()

Something like getImage(getDocumentBase(), (String)table.getValueAt(table.getSelectedRow(), 4))

A better choice would be to use ImageIO. The main reason for this is that it won't use a background thread to load the image and will throw a IOException if something goes wrong, making it easier to diagnose any problems...

Something like...

BufferedImage image = ImageIO.read(new URL(getDocumentBase(), (String)table.getValueAt(table.getSelectedRow(), 4)));
于 2013-02-18T02:05:39.507 回答