2012-03-16 5 views
2

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

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

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"); 
        } 
       } 
      }); 
} 
+0

Как вы используете код? Вы проверяете консоль Java? Зачем кодировать апплет, а не кадр? Я, наверное, догадываюсь, почему он терпит неудачу, но это будет более поучительно для вас. BTW - замените 'String []' на ['DefaultComboBoxModel'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/DefaultComboBoxModel.html) и зациклируйте на' addElement() '22 раза. –

+0

В вашем 'ActionListener' попытайтесь использовать' label.setIcon (новый ImageIcon ("chicken.gif")) 'Я не уверен, что создать новое изображение достаточно. (метка должна быть объявлена ​​в классе, а не в init(), если вы это сделаете) –

ответ

2

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

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

if (select == 0) 
{ 
    try 
    { 
     label.setIcon(new ImageIcon(ImageIO.read(new File("chicken.gif")))); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Да, теперь это выглядит, но проблема слишком велика. как я могу его отрегулировать? Мне нужно сделать метод краски? – sack

+0

no Вы можете использовать массив файлов для установки в изображениях и завершать все предложения if-else в один try-catch. – Juvanis

+0

Я имею в виду, что изображение слишком велико – sack

2

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

  1. Размер описания String Array составляет 22, и вы добавляете значение индекса 22, то это приведет к ArrayIndexOutOfBoundsException.
  2. Созданный вами ImageIcon ничего не имеет, поэтому, добавив его в JLabel, он ничего не покажет, как и ожидалось.
  3. Объект BorderLayout имеет пять областей. Эти области указаны константами BorderLayout: А именно PAGE_START, PAGE_END, LINE_START, LINE_END и CENTER. Но вы используете подход NORTH, EAST, WEST, SOUTH, это старый.

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

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 показано на этом посту моего: Access Images via ImageIO

3

Я использую это, чтобы изменить мою 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; 
    } 
+1

+1, Wololololulu, это выглядит потрясающе :-) –

+1

+1 Это правильный ответ на изменение размера изображения. спасибо – YumYumYum

Смежные вопросы