2015-02-03 3 views
0

это мой кодКаким образом JFrame обновляется?

public class ComboBoxDemo extends JFrame { 
ArrayList<Common.DescriptionPanel> cartoon = new ArrayList<Common.DescriptionPanel>(); 
ArrayList<ImageIcon> image = new ArrayList<ImageIcon>(); 
ArrayList<String> title = new ArrayList<String>(); 
ArrayList<String> description = new ArrayList<String>(); 
JComboBox combo = new JComboBox(); 

Common.DescriptionPanel panel = new Common.DescriptionPanel(); 


public static void main(String[] args) { 
    new Common.SetFrame(new ComboBoxDemo(), "Combo Box"); 
} 


public ComboBoxDemo() { 
    addCartoon(new ImageIcon("c.jpg"), "Mario", "This is Mario"); 
    addCartoon(new ImageIcon("d.jpg"), "Sonic", "This is Sonic"); 
    addCartoon(new ImageIcon("e.jpg"), "Astro Boy", "This is Astro Boy"); 

    for (int i = 0; i < cartoon.size(); i++) { 
     cartoon.get(i).setImage(image.get(i)); 
     cartoon.get(i).setTitle(title.get(i)); 
     cartoon.get(i).setDescription(description.get(i)); 
     combo.addItem(title.get(i)); 
    } 

    combo.setBackground(Color.white); 
    combo.setForeground(Color.blue); 
    combo.setSelectedItem(cartoon.get(0)); 

    panel = cartoon.get(0); 

    add(combo, BorderLayout.NORTH); 
    add(panel, BorderLayout.CENTER); 

    combo.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      panel = cartoon.get(combo.getSelectedIndex()); 

      pack(); 
      System.out.println(panel.textArea.getText()); 
     } 
    }); 
} 

void addCartoon(ImageIcon image, String title, String description) { 
    cartoon.add(new Common.DescriptionPanel()); 
    this.image.add(image); 
    this.title.add(title); 
    this.description.add(description); 

} 

}

и код DescriptionPanel является

общественного класса DescriptionPanel расширяет JPanel {

private JLabel imageTitle = new JLabel(); 
public JTextArea textArea = new JTextArea(); 

public DescriptionPanel() { 
    imageTitle.setHorizontalAlignment(JLabel.CENTER); 
    imageTitle.setHorizontalTextPosition(JLabel.CENTER); 
    imageTitle.setVerticalTextPosition(JLabel.BOTTOM); 
    imageTitle.setFont(Common.SetFont.boldFont); 


    textArea.setLineWrap(true); //when one line doesn't fit, it will jump to next line automatically 
    /* 
    * The wrapStyleWord property is set to true (line 23) so that the line is wrapped 
    * on words rather than characters. 
    */ 
    textArea.setWrapStyleWord(true); 
    textArea.setEditable(false); 
    textArea.setFont(Common.SetFont.boldFont); 
    textArea.setForeground(Color.blue); 

    JScrollPane scrollpane = new JScrollPane(textArea); 
    setLayout(new GridLayout(1, 2)); 

    add(imageTitle); 
    add(scrollpane); 


} 

public void setImage(ImageIcon image) { 
    imageTitle.setIcon(image); 
} 

public void setTitle(String title) { 
    imageTitle.setText(title); 
} 

public void setDescription(String description) { 
    textArea.setText(description); 
} 

}

, когда я выбрать повторно combobox, JFrame не будет ch Анж вообще, поэтому я заменить код

   panel = cartoon.get(combo.getSelectedIndex()); 

к коду

panel.setTitle(title.get(combo.getSelectedIndex())); 
      panel.setDescription(description.get(combo.getSelectedIndex())); 
      panel.setImage(image.get(combo.getSelectedIndex())); 

и она работает.

так в чем же разница между этими двумя кодами? В первом коде панель видимо изменяется, потому что, когда я печатаю текстовую область, она отличается от начальной, но JFrame не изменяется.

Почему второй код может работать?

+1

Разница между этими два кода? 100% - в них нет ничего одинакового. Один задает 'panel' для чего-то, другой устанавливает свойства на' panel' значениям. – John3136

+0

Вы никогда не должны поддерживать компоненты в 'JComboBox' (или' JList', или 'JTree' или' JTable'). Эти компоненты должны предоставлять базовые данные, которые каждый компонент может быть настроен отдельно для отображения по-разному по мере необходимости. После выбора вы должны просто изменить свойства того компонента, который вы используете для отображения данных, поддерживаемых 'JComboBox' (что в основном делает ваш второй пример) – MadProgrammer

+0

' panel = cartoon.get (combo.getSelectedIndex()); ' - Пожалуйста, объясните своими словами, что вы думаете об этом. – immibis

ответ

1
panel = cartoon.get(combo.getSelectedIndex()); 

Это просто меняет ссылку на panel (то, что он, указывая в памяти) к тому, что когда-либо хранится в текущей позиции ComboBox. Это не влияет на то, что panel когда-то ссылался.

panel.setTitle(title.get(combo.getSelectedIndex())); 
panel.setDescription(description.get(combo.getSelectedIndex())); 
panel.setImage(image.get(combo.getSelectedIndex())); 

Изменение свойств текущего объекта, что переменная panel ссылается.

Потому что у вас есть предыдущие добавил panel к раме (add(panel, BorderLayout.CENTER);, это будет влиять на компонент, который находится на экране.

Вы никогда не должны поддерживать данные на основе компонентов в пределах этого типа компонента. Вместо этого, ваш выпадающий должен быть заполненными данными, которые он может использовать для рендеринга желаемого результата на основе текущих потребностей пользовательского интерфейса и которые вы можете использовать для осуществления какого-либо другого представления. Это основная концепция парадигмы Model-View-Controller.

+0

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

+0

По существу, да. Если вы измените ссылку, то то, что вы меняете, не то, что вы используете для пинты, но то, что вы сейчас указываете на – MadProgrammer

+0

Что вы должны делать, это отдельные данные из представления. Затем разрешите представлению взять копию данных и соответственно обновить их, таким образом, вы никогда не меняете ссылку на представление, а просто даете ему новые данные для отображения – MadProgrammer

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