Как добавить изображение в панель? - PullRequest
2 голосов
/ 16 марта 2012

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

Это то, что я пробовал до сих пор:

public class Main extends JApplet
{
private String[] description;
private JList list = new JList();
private DefaultListModel defaultListModel = new DefaultListModel();
private JComboBox c = new JComboBox();
private JButton b = new JButton("Ok");
private ImageIcon image;

public void init()
{
    try
    {
        description = new String[22];
        description[0] = "1990";
        description[1] = "1991";
        description[2] = "1992";
        description[3] = "1993";
        description[4] = "1994";
        description[5] = "1995";
        description[6] = "1996";
        description[7] = "1997";
        description[8] = "1998";
        description[9] = "1999";
        description[10] = "2000";
        description[11] = "2001";
        description[12] = "2002";
        description[13] = "2003";
        description[14] = "2004";
        description[15] = "2005";
        description[16] = "2006";
        description[17] = "2007";
        description[18] = "2008";
        description[19] = "2009";
        description[20] = "2010";
        description[21] = "2011";
        description[22] = "2012";
    }
    catch (ArrayIndexOutOfBoundsException e)
    {
        e.printStackTrace();
    }

    c = new JComboBox(description);
    list = new JList(defaultListModel);

    list.setBorder(BorderFactory.createLineBorder(Color.black, 1));
    b.setText("<html><b><u>Click</click></b></html>");
    list.setFont(new Font("Garamond", Font.BOLD, 17));
    list.setForeground(Color.BLUE);

    JLabel label = new JLabel(image);

    JPanel down = new JPanel();
    down.setBorder(BorderFactory.createEmptyBorder(100, 100, 100, 100));
    down.add(label);

    JPanel panel = new JPanel();

    panel.add(c);
    panel.add(b);

    Container cp = getContentPane();

    cp.add(list, BorderLayout.CENTER);
    cp.add(panel, BorderLayout.NORTH);
    cp.add(down, BorderLayout.SOUTH);

    this.setVisible(true);

    b.addActionListener(
            new ActionListener()
            {
                public void actionPerformed(ActionEvent
                                                    event)
                {
                    int select;
                    select = c.getSelectedIndex();
                    defaultListModel.clear();
                    if (select == 0)
                    {
                        defaultListModel.addElement("the year of 1990");

                        image = new ImageIcon("chicken.gif");
                    }
              }
            });
}

Ответы [ 3 ]

3 голосов
/ 16 марта 2012

Я использую это, чтобы изменить мой ImageIcon:

               if (select == 0)
                {
                    defaultListModel.addElement("the year of 1990");
                    image = new ImageIcon("chicken.gif") 
                    label.setIcon(new ImageIcon(getScaledImage(image.getImage(), 32, 32))))
                }
  ....

    /**
     * Resizes an image using a Graphics2D object backed by a BufferedImage.
     * @param srcImg - source image to scale
     * @param w - desired width
     * @param h - desired height
     * @return - the new resized image
     */
    private Image getScaledImage(Image srcImg, int w, int h){
        BufferedImage resizedImg = new BufferedImage(w, h, BufferedImage.TRANSLUCENT);
        Graphics2D g2 = resizedImg.createGraphics();
        g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g2.drawImage(srcImg, 0, 0, w, h, null);
        g2.dispose();
        return resizedImg;
    }
2 голосов
/ 16 марта 2012

Есть ряд вещей, которые вы делаете неправильно в своем коде.

  1. Размер описания String Array равен 22, и вы добавляете значение к индексу 22, это приведет к ArrayIndexOutOfBoundsException.
  2. Созданный вами ImageIcon не имеет ничего равного нулю, поэтому при добавлении его в JLabel он ничего не будет отображать, как ожидалось.
  3. Объект BorderLayout имеет пять областей. Эти области определяются константами BorderLayout: А именно PAGE_START, PAGE_END, LINE_START, LINE_END и CENTER. Но вы используете подход СЕВЕР, ВОСТОК, ЗАПАД, ЮГ, это старое.

Здесь я немного изменил ваш код, посмотрите, идет ваше изображение или нет.

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

public class Main extends JApplet
{
    private String[] description;

    private JList list = new JList();

    private DefaultListModel defaultListModel = new DefaultListModel();

    private JComboBox c = new JComboBox();

    private JButton b = new JButton("Ok");

    private ImageIcon image;

    private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon");


    public void init()
    {


        try
        {


            description = new String[22];

            description[0] = "1990";
            description[1] = "1991";
            description[2] = "1992";
            description[3] = "1993";
            description[4] = "1994";
            description[5] = "1995";
            description[6] = "1996";
            description[7] = "1997";
            description[8] = "1998";
            description[9] = "1999";
            description[10] = "2000";
            description[11] = "2001";
            description[12] = "2002";
            description[13] = "2003";
            description[14] = "2004";
            description[15] = "2005";
            description[16] = "2006";
            description[17] = "2007";
            description[18] = "2008";
            description[19] = "2009";
            description[20] = "2010";
            description[21] = "2011";
            //description[22] = "2012";
        }
        catch (ArrayIndexOutOfBoundsException e)
        {
            e.printStackTrace();
        }

        c = new JComboBox(description);
        list = new JList(defaultListModel);

        list.setBorder(BorderFactory.createLineBorder(Color.black, 1));
        b.setText("<html><b><u>Click</click></b></html>");
        list.setFont(new Font("Garamond", Font.BOLD, 17));
        list.setForeground(Color.BLUE);

        final JLabel label = new JLabel(image);


        JPanel down = new JPanel();
        down.setBorder(BorderFactory.createEmptyBorder(100, 100, 100, 100));
        down.add(label);

        JPanel panel = new JPanel();

        panel.add(c);
        panel.add(b);

        Container cp = getContentPane();

        cp.add(list, BorderLayout.CENTER);
        cp.add(panel, BorderLayout.PAGE_START);
        cp.add(down, BorderLayout.PAGE_END);

        this.setVisible(true);


        b.addActionListener(

            new ActionListener()
            {

                public void actionPerformed(ActionEvent
                                                    event)
                {
                    int select;
                    select = c.getSelectedIndex();
                    defaultListModel.clear();
                    if (select == 0)
                    {
                        defaultListModel.addElement("the year of 1990");

                        label.setIcon(infoIcon);

                    }
                    else
                    {
                        label.setIcon(null);
                    }
              }
            });
    }
}

Лучший подход для доступа к изображению с использованием ImageIO с URL, поскольку изображение является Application Resource, поэтому гораздо разумнее получить к нему доступ через URL вместо File, показанное в этом посте. мой: Доступ к изображениям через ImageIO

2 голосов
/ 16 марта 2012

Прежде всего, у вас есть ошибка в начале метода init(), которая не связана с вашим актуальным вопросом. У вас есть массив из 22 строк, и вы пытаетесь присвоить значение 23-му индексу, это неправильно, вы получите ошибку, если не откажетесь от нее.

По вашему актуальному вопросу, изменение значения изображения не меняет / не обновляет метку. Попробуйте приведенный ниже фрагмент кода в методе actionPerformed(), однако вам нужно сделать вашу метку окончательной или глобальной переменной.

if (select == 0)
{
    try
    {
        label.setIcon(new ImageIcon(ImageIO.read(new File("chicken.gif"))));
    } catch (IOException e) {
        e.printStackTrace();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...