Robię małą aplikację bazodanową i szukam możliwości przypisania do kontrolki combobox dodatkowego parametru (id z tabeli), który jednak nie byłby widoczny w polu combo ( jak po dodaniu metodą addItem) a możliwe było by jego "wyłuskanie" po wybraniu określonego Itemu z kontrolki. Muszę tego parametru użyć do kolejnego zapytania do bazy, a nie chcę aby szpecił wyświetlane rekordy w kontrolce combo.
Nie jestem pewien o co ci chodzi ? Jeśli chcesz chcesz by każdy item zawierał coś co nie jest wyświetlane, to
użyj metody setRenderer(..).
Zajrzyj tu http://java.sun.com/docs/books/tutorial/uiswing/components/combobox.html
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
class Option {
int id;
String name;
public Option(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return name;
}
}
public class Main {
public static void main(String[] args) {
final JFrame frame = new JFrame();
Object[] data = {new Option(1, "Pierwszy"), new Option(2, "Coś innego"), new Option(3, "Trzeci")};
final JComboBox jb = new JComboBox(data);
frame.add(jb);
frame.setVisible(true);
jb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Option selected = (Option) jb.getSelectedItem();
JOptionPane.showMessageDialog(frame, "Wybrałeś id=" + selected.id);
}
});
}
}
bogdans - nie do końca o to chodziło, ale dzięki za podpowiedź. Hurikhans - działa ! Dzięki !
Hej!
Odświerze temat ;)
Mi tez ten przykład pomódł. Wiemy jak pobrać ID a jak je ustawić?
jb.setSelectedItem(???);
mozna tak:
jb.setSelectedItem(data[2]);
Tyle tylko ze to jest bez sensu poniewaz ustawia wedlug iteratora w tablicy a nie wedlug ID w objekcie :(
A co jesli mamy taki mini model selecta i wczytujac z bazy rekordy robimy to tak:
while(rs.next())
jb.addItem(new ModelSelect(rs.getInt("ID"), rs.getString("NAME")));
...a co w takim przypadku? jak wykonac set'a :( kompletnie nie wiem :/
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
class Option {
int id;
String name;
public Option(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return name;
}
}
public class Main {
public static void main(String[] args) {
final JFrame frame = new JFrame();
final Object[] data = {new Option(1, "Pierwszy"), new Option(2, "Coś innego"), new Option(3, "Trzeci")};
final JComboBox jb = new JComboBox(data);
frame.getContentPane().setLayout(new BorderLayout());
frame.add(jb, BorderLayout.CENTER);
final JButton button = new JButton(new AbstractAction("Ustaw na id=2") {
public void actionPerformed(ActionEvent e) {
for (Object item : data) {
Option option = (Option) item;
if (option.id == 2) {
jb.setSelectedItem(item);
break;
}
}
}
});
frame.add(button, BorderLayout.SOUTH);
frame.setVisible(true);
jb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Option selected = (Option) jb.getSelectedItem();
JOptionPane.showMessageDialog(frame, "Wybrałeś id=" + selected.id);
}
});
}
No fajnie, ale bardziej by mnie interesowalo dla tego drugiego sposobu kiedy dodaje do comboxa w sposob nie jawny. W tym przypadku nie mam zadnej zmiennej z danymi.
while(rs.next())
jb.addItem(new ModelSelect(rs.getInt("ID"), rs.getString("NAME")));
lusss napisał(a)
No fajnie, ale bardziej by mnie interesowalo dla tego drugiego sposobu kiedy dodaje do comboxa w sposob nie jawny. W tym przypadku nie mam zadnej zmiennej z danymi.
while(rs.next())
jb.addItem(new ModelSelect(rs.getInt("ID"), rs.getString("NAME")));
Tak sie nie powinno robic :P. A co jeśli będziesz chciał wyświetlić te same elementy w innej kontrolce?. Jeśli już to zrób tak:
List<ModelSelect> models = new ArrayList<ModelSelect>();
while(rs.next()) {
ModelSelect model = new ModelSelect(rs.getInt("ID"), rs.getString("NAME"));
models.add(model);
jb.addItem(model);
}
a potem przy ustawianiu:
for (ModelSelect model : models) {
if (model.id == 2) {
jb.setSelectedItem(model);
break;
}
}
Kurcze dzięki :)
Porwałem się na głeboką wodę - postanowiłem pisać sporą aplikację i myślełem że znam podstawy a tu się okazuje, że duże rzeczy robie a tu takich podstaw brakło.
Węszyłem coś za 'List' no ale jeszcze brakuje mi pewnego poziomu wyobrazenia abstrakcji w jave.
Kod działa a jakże, ale mam kilka takich selectów (wartosc do zaznaczenia pobierana z bazy) i ten kod bedzie znacznie pogrubszal aplikacje. Nie ma jakiegoś mniej linijkowatego kodu? A co z budową MODELU dla jComboBox. Moze na poziomie modelu da rade zaznaczac przy zachowaniu dwu wartosciowego comboxa.