1

私はプログラミングクラスの一部としてJavaでアプレットを作成しました。このアプレットは、人の誕生日を受け取り、その人が生まれた曜日を見つけます。割り当ての仕様に従って、このアプレットをAmazonEC2仮想サーバーにも配置します。

これで、人物がJTableから選択されると、プログラムはその人物の情報と、情報の横にあるJTableにある画像ファイルへのパスを取得します。したがって、たとえば、次の要素で構成される選択を行うことができます。

| John Doe | 17 | 02 | 2013 | /images/John.jpg |

これをローカルマシンで実行すると、すべてが期待どおりに機能します。日付が計算され、画像が表示されます。ただし、サーバーに配置すると、次の2つのいずれかが発生します。

  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)画像のファイル名を指定するために使用されます。これは、ネットワーク パスではなく、ローカル ディスクのイメージをロードするために使用する必要があります。

画像がアプレットに対して相対的にロードされる場合はApplet#getImage(URL, String)、参照を渡すことを使用します。Applet#getDocumentBase()

何かのようなものgetImage(getDocumentBase(), (String)table.getValueAt(table.getSelectedRow(), 4))

を使用することをお勧めしますImageIO。これの主な理由は、画像をロードするためにバックグラウンド スレッドを使用せず、問題が発生したIOException場合にスローして、問題の診断を容易にすることです...

何かのようなもの...

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