Не знаю, что не так с моим кодом. Java GUI - PullRequest
0 голосов
/ 28 декабря 2011

Я пытаюсь создать поле со списком, которое всплывает с изображением. Я получаю эту ошибку:

Примечание: C: \ Users \ Kyle \ Desktop \ TUSEG \ Program \ ProductDemo.java использует непроверенные или небезопасные операции. Примечание: Перекомпилируйте с -Xlint: не проверено для деталей.

Во всяком случае, когда он пытается поднять картинку, я получаю это каждый раз:

Не удалось найти файл: C: \ Users \ Kyle \ Desktop \ TUSEG \ Program \ images \ microsoft \ Контроллер Xbox 360 (ПК) .jpg
Не удалось найти файл: C: \ Users \ Kyle \ Desktop \ TUSEG \ Program \ images \ microsoft \ Wireless Laser Mouse 5000.jpg

Путь, безусловно, правильный. Я не уверен, в чем моя проблема. Если бы кто-нибудь мог взглянуть на это и помочь мне?

    package components;

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.util.*;

    public class ProductDemo extends JPanel
                      implements ActionListener {
JLabel picture;

public ProductDemo() {
    super(new BorderLayout());

    String pMS[] = new String[23];
    pMS[0] = ("LifeChat LX-3000");
    pMS[1] = ("LifeChat ZX-6000");
    pMS[2] = ("Wireless Notebook Presenter 8000");
    pMS[3] = ("Arc Mouse");
    pMS[4] = ("Bluetooth Notebook Mouse 5000");
    pMS[5] = ("Explorer Mouse");
    pMS[6] = ("Explorer Mini Mouse");
    pMS[7] = ("Sidewinder X8 Mouse");
    pMS[8] = ("Wireless Laser Mouse 5000");
    pMS[9] = ("Wireless Mobile Mouse 3000");
    pMS[10] = ("Wireless Mobile Mouse 6000");
    pMS[11] = ("Arc Keyboard");
    pMS[12] = ("Bluetooth Mobile Keyboard 6000");
    pMS[13] = ("Sidewinder X4 Keyboard");
    pMS[14] = ("Sidewinder X6 Keyboard");
    pMS[15] = ("Ergonomic Desktop 7000");
    pMS[16] = ("Wireless Desktop 3000");
    pMS[17] = ("Wireless Laser Desktop 6000 v2.0");
    pMS[18] = ("Wireless Media Desktop 1000");
    pMS[19] = ("Windows Server 2008 Enterprise");
    pMS[20] = ("Notebook Cooling Base");
    pMS[21] = ("Xbox 360 Controller (PC)");
    pMS[22] = ("Xbox 360 Controller");
    Arrays.sort(pMS);

    //Indices start at 0, so 4 specifies the last index of the product.
    JComboBox msList = new JComboBox(pMS);
    msList.setSelectedIndex(22);
    msList.addActionListener(this);

    //Set up the picture.
    picture = new JLabel();
    picture.setFont(picture.getFont().deriveFont(Font.ITALIC));
    picture.setHorizontalAlignment(JLabel.CENTER);
    updateLabel(pMS[msList.getSelectedIndex()]);
    picture.setBorder(BorderFactory.createEmptyBorder(10,0,0,0));

    //height + width
    picture.setPreferredSize(new Dimension(100, 100));

    //Lays out the demo.
    add(msList, BorderLayout.PAGE_START);
    add(picture, BorderLayout.PAGE_END);
    setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
}

/** Listens to the combo box. */
public void actionPerformed(ActionEvent e) {
    JComboBox cb = (JComboBox)e.getSource();
    String pMS = (String)cb.getSelectedItem();
    updateLabel(pMS);
}

protected void updateLabel(String name) {
    ImageIcon icon = createImageIcon("C:\\Users\\Kyle\\Desktop\\TUSEG\\Program\\images\\microsoft\\" + name + ".jpg");
    picture.setIcon(icon);
    if (icon != null) {
        picture.setText(null);
    }
    else {
        picture.setText("Image not found");
    }
}

/** Returns an ImageIcon, or null if the path was invalid. */
protected static ImageIcon createImageIcon(String path) {
    java.net.URL imgURL = ProductDemo.class.getResource(path);
    if (imgURL != null) {
        return new ImageIcon(imgURL);
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
}

/**
 * Create the GUI and show it.  For thread safety,
 * this method should be invoked from the
 * event-dispatching thread.
 */
private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("ProductDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    JComponent newContentPane = new ProductDemo();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);

    //Display the window.
    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}
}

Ответы [ 2 ]

3 голосов
/ 28 декабря 2011

Вы, похоже, путаете путь, основанный на File, например ..

C:\Users\Kyle\Desktop\TUSEG\Program\images\microsoft\Xbox 360 Controller (PC).jpg

.. с относительной ссылкой для использования в getResource(String), такой как:

"images/microsoft/Xbox 360 Controller (PC).jpg"

Метод getResource() ожидает строку с использованием прямой косой черты, то есть относительно пути к классам во время выполнения приложения (поэтому каталог images и т. Д. Чаще всего добавляется в Jar). Чтобы убедиться, что он работает из класса из любого пакета, добавьте строку /.

.
"/images/microsoft/Xbox 360 Controller (PC).jpg"

Метод getResource() вернет URL, поэтому обязательно используйте URL-совместимые конструкторы.

1 голос
/ 28 декабря 2011

Решите, хотите ли вы загружать изображения из файловой системы или из пути к классам приложения.

Если из файловой системы, использовать файл IO для загрузки иконки или конструктор, принимающий имя файла в качестве аргумента:

ImageIcon icon = new ImageIcon("c:\\....jpg");

Если из пути к классам, то это путь / разделенный путь, начинающийся с корня пути к классам, и изображения должны храниться в том же каталоге / jar, что и ваши классы (или в другом каталоге / jar, который находится в классам):

ImageIcon icon = new ImageIcon(ProductDemo.class.getResource("/path/to/image.jpg"));

См. http://docs.oracle.com/javase/6/docs/api/javax/swing/ImageIcon.html и http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getResource%28java.lang.String%29

...