это мой кодКаким образом 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 не изменяется.
Почему второй код может работать?
Разница между этими два кода? 100% - в них нет ничего одинакового. Один задает 'panel' для чего-то, другой устанавливает свойства на' panel' значениям. – John3136
Вы никогда не должны поддерживать компоненты в 'JComboBox' (или' JList', или 'JTree' или' JTable'). Эти компоненты должны предоставлять базовые данные, которые каждый компонент может быть настроен отдельно для отображения по-разному по мере необходимости. После выбора вы должны просто изменить свойства того компонента, который вы используете для отображения данных, поддерживаемых 'JComboBox' (что в основном делает ваш второй пример) – MadProgrammer
' panel = cartoon.get (combo.getSelectedIndex()); ' - Пожалуйста, объясните своими словами, что вы думаете об этом. – immibis