Hej,
Kończę właśnie pisać obsadzanie JComboBox'a JLabelami zawierającymi tworzone dynamicznie ikony i pobierany dynamicznie tekst i korzystam przy obsadzaniu z ListCellRenderer'a, ale nie wiem, czy to już przez zmęczenie, czy te upały, ale utknąłem... Mam napisanego ListCellRenderer'a i metodę w głównej klasie, która z niego korzysta. Problem, który próbuję teraz rozwiązać polega na tym, że chcę, by ListCellRenderer dodawał kolejne JLabele do JComboBoxa z uwzględnieniem już znajdujących się w boxie itemów (JLabeli właśnie). Jak na razie wywołanie metody ustawiającej renderer dla boxa po prostu nadpisuje już znajdujący się w nim JLabel, wiem dlaczego tak się dzieje, ale nie wiem jak zrobić, by itemy były dodawane do puli, a nie były nadpisywane.
Prezentuje to poniższy przykład:
- Naciskam :niebieską strzałkę w prawo: która zawiera metodę wykorzystującą renderer. JLabel pojawia się w boxie.
- Wpisuję nową wartość w textfieldzie (tym po lewej).
- Naciskam :niebieską strzałkę w prawo: i znowu wywołuję metodę z rendererem. JLabel pojawia się w boxie.
- Problem w tym, że nowy JLabel nadpisał wcześniejszy item.
Jak temu zaradzić? Poniżej kod Renderera i metody.
/*
* Renderer
*/
import java.awt.Component;
import javax.swing.*;
public class ComboRenderer extends JLabel implements ListCellRenderer {
// Deklaruję zmienne dla tekstu oraz ikony dla przyszłego JLabela
String text;
ColorSwatch icon; // ColorSwatch jest klasą implementującą 'Icon'. Tworzy ikonkę.
public ComboRenderer (String text_d, ColorSwatch icon_d) {
setOpaque(true);
setHorizontalAlignment(CENTER);
setVerticalAlignment(CENTER);
text = text_d;
icon = icon_d;
}
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
setIcon(icon);
setText(text);
return this;
}
}
/*
* Metoda pobierająca tekst, tworząca ikonę oraz ustawiająca renderer dla JComboBox'a
*/
public void setComboBox() {
String value = field.getText().toString(); // Pobieram tekst z JTextField'a
Color color = tcc.getColor(); // Pobieram kolor z innego JLabela
ColorSwatch icon = new ColorSwatch(10, true); // Tworzę nową ikonę
icon.setColor(color); // Ustawiam jej kolor
ComboRenderer renderer = new ComboRenderer(value, icon); // Tworzę nowy renderer
boxColor.setRenderer(renderer); // Ustawiam renderer
boxColor.setMaximumRowCount(5); // Ustawiam wielkość wyświetlanego obszaru
}
/*
* Przycisk :niebieska strzałka w prawo:
*/
JButton copy = new JButton();
copy.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
String hex = field.getText(); // Pobieram wartość z JTextFielda
boolean canI = CheckHexValue(hex); // Sprawdzam szereg zależności w metodzie CheckHexValue()
if (canI) {
setComboBox(); // Odpalam metodę setComboBox()
boxColor.repaint(); // Odmalowuję JComboBox'a
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e); // W razie 'w' wyświetlam JOptionPane z treścią 'w'.
}
}
});
Chciałbym w jakiś sposób wysyłać do renderer'a dane o aktualnej zawartości JComboBoxa i jeżeli coś się wnim znajduje to, żeby do istniejących już w nim obiektów był dodawany następny JLabel o właściwościach określonych w konstruktorze, czyli "ComboRenderer(String text, ColorSwatch icon)".
Będę ogromnie wdzięczny za pomoc.
Pozdrawiam serdecznie!