Hallo,
zum Problem: Ich wollte eine eigene JComboBox mit eigenem Inhalt erstellen, also Konkret pro Zeile ein Icon + String bzw Int + Icon + String, da ich allerdings nur begrenzt Platz habe, sollte das Dropdownmenü breittechnisch so klein wie möglich sein, deshalb wäre es z.B. prima, wenn anfangs nur das Icon zu sehen ist und beim ausklappen das Popupmenü dann die volle bereite des Inhalts anzeigt, ich habe dazu auch 2 verschiedene Ansätze gefunden mit Codebeispielen den ich gleich auch noch posten werde:
Hier ist ein Codebeispiel auf einer Seite: http://docs.oracle.com/javase/tutor...roject/src/components/CustomComboBoxDemo.java
Mit diesem beispiel konnte ich das Icon + Stringproblem lösen in verbindung mit dem folgenden Codebeispiel ging dann auch die breite, indem ich versucht habe das Ganze anzupassen, allerdings kommt am anfang immer eine Fehlermeldung extrem kurz eingeblendet und dann wird anscheinend alles normal erstellt, hatte auch gelesen, das es mit dem unteren codebeispiel wohl da einen Bug gibt, allerdings bin ich eher noch javaAnfänger, weswegen ich auch nicht weiß, wie gravierend das Ganze ist, weil normal sollte man fehler ja nicht ignorieren Selbst wenn ich das weiter so nutze stellte sich mir auch die Frage, wie ich die ComboBox dann überhaupt noch anspreche, da man die getSelected etc. Methoden ja nicht mehr aufrufen kann und da ich ja mit der auswahl, die ein user trifft dann auch weiter arbeiten will, wäre auch das dann gut zu wissen, wie man das dann am besten löst, zudem wird bei dieser lösung auch nicht mehr der Hintergrund farblich markiert im Popupmenü,also man sieht nicht mehr, welches Objekt man dabei ist auszuwählen, ich hoffe ihr versteht was ich meine, das aber eher nebensächlich, solange der rest klappen würde.^^
Ich habe zum unteren beispiel auch noch eine an sich bessere lösung gefunden, die automatisch die breite des größten objekts im popupmenü ermittelt,allerdings klappt die in verbindung mit dem 1.codebeispiel im link nicht, weil soweit ich verstanden habe dort ja ein Int-Array der combobox übergeben wird und die Breite von denen ja nicht mit dem tatsächlichen inhalt am ende übereinstimmt.
Also wäre es jetzt echt prima, wenn man mir entweder bessere Lösungen/ansätze zeigen könnte für die Umsetzung oder Literatur, die das ganze halbwegs gut erklärt und ich mich somit einlesen könnte, weil bis jetzt konnte ich so nix besseres finden, was mir da weiterhilft, bedanke mich schonmal für eure hilfe im vorfeld, hoffe es war nicht zuviel zu lesen.
hier nochmal die an sich bessere combobox, die halt nicht klappt:
zum Problem: Ich wollte eine eigene JComboBox mit eigenem Inhalt erstellen, also Konkret pro Zeile ein Icon + String bzw Int + Icon + String, da ich allerdings nur begrenzt Platz habe, sollte das Dropdownmenü breittechnisch so klein wie möglich sein, deshalb wäre es z.B. prima, wenn anfangs nur das Icon zu sehen ist und beim ausklappen das Popupmenü dann die volle bereite des Inhalts anzeigt, ich habe dazu auch 2 verschiedene Ansätze gefunden mit Codebeispielen den ich gleich auch noch posten werde:
Hier ist ein Codebeispiel auf einer Seite: http://docs.oracle.com/javase/tutor...roject/src/components/CustomComboBoxDemo.java
Mit diesem beispiel konnte ich das Icon + Stringproblem lösen in verbindung mit dem folgenden Codebeispiel ging dann auch die breite, indem ich versucht habe das Ganze anzupassen, allerdings kommt am anfang immer eine Fehlermeldung extrem kurz eingeblendet und dann wird anscheinend alles normal erstellt, hatte auch gelesen, das es mit dem unteren codebeispiel wohl da einen Bug gibt, allerdings bin ich eher noch javaAnfänger, weswegen ich auch nicht weiß, wie gravierend das Ganze ist, weil normal sollte man fehler ja nicht ignorieren Selbst wenn ich das weiter so nutze stellte sich mir auch die Frage, wie ich die ComboBox dann überhaupt noch anspreche, da man die getSelected etc. Methoden ja nicht mehr aufrufen kann und da ich ja mit der auswahl, die ein user trifft dann auch weiter arbeiten will, wäre auch das dann gut zu wissen, wie man das dann am besten löst, zudem wird bei dieser lösung auch nicht mehr der Hintergrund farblich markiert im Popupmenü,also man sieht nicht mehr, welches Objekt man dabei ist auszuwählen, ich hoffe ihr versteht was ich meine, das aber eher nebensächlich, solange der rest klappen würde.^^
Ich habe zum unteren beispiel auch noch eine an sich bessere lösung gefunden, die automatisch die breite des größten objekts im popupmenü ermittelt,allerdings klappt die in verbindung mit dem 1.codebeispiel im link nicht, weil soweit ich verstanden habe dort ja ein Int-Array der combobox übergeben wird und die Breite von denen ja nicht mit dem tatsächlichen inhalt am ende übereinstimmt.
Also wäre es jetzt echt prima, wenn man mir entweder bessere Lösungen/ansätze zeigen könnte für die Umsetzung oder Literatur, die das ganze halbwegs gut erklärt und ich mich somit einlesen könnte, weil bis jetzt konnte ich so nix besseres finden, was mir da weiterhilft, bedanke mich schonmal für eure hilfe im vorfeld, hoffe es war nicht zuviel zu lesen.
Code:
import javax.swing.*;
import java.awt.*;
import java.util.Vector;
// got this workaround from the following bug:
// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4618607
public class WideComboBox extends JComboBox{
public WideComboBox() {
}
public WideComboBox(final Object items[]){
super(items);
}
public WideComboBox(Vector items) {
super(items);
}
public WideComboBox(ComboBoxModel aModel) {
super(aModel);
}
private boolean layingOut = false;
public void doLayout(){
try{
layingOut = true;
super.doLayout();
}finally{
layingOut = false;
}
}
public Dimension getSize(){
Dimension dim = super.getSize();
if(!layingOut)
dim.width = Math.max(dim.width, getPreferredSize().width);
return dim;
}
}
Code:
public class WiderDropDownCombo extends JComboBox {
private String type;
private boolean layingOut = false;
private int widestLengh = 0;
private boolean wide = false;
public WiderDropDownCombo(Object[] objs) {
super(objs);
}
public boolean isWide() {
return wide;
}
// Setting the JComboBox wide
public void setWide(boolean wide) {
this.wide = wide;
widestLengh = getWidestItemWidth();
}
public Dimension getSize() {
Dimension dim = super.getSize();
if (!layingOut && isWide())
dim.width = Math.max(widestLengh, dim.width);
return dim;
}
public int getWidestItemWidth() {
int numOfItems = this.getItemCount();
Font font = this.getFont();
FontMetrics metrics = this.getFontMetrics(font);
int widest = 0;
for (int i = 0; i < numOfItems; i++) {
Object item = this.getItemAt(i);
int lineWidth = metrics.stringWidth(item.toString());
widest = Math.max(widest, lineWidth);
}
return widest + 5;
}
public void doLayout() {
try {
layingOut = true;
super.doLayout();
} finally {
layingOut = false;
}
}
public String getType() {
return type;
}
public void setType(String t) {
type = t;
}
public static void main(String[] args) {
String title = "Combo Test";
JFrame frame = new JFrame(title);
String[] items = {
"I need lot of width to be visible , oh am I visible now",
"I need lot of width to be visible , oh am I visible now" };
WiderDropDownCombo simpleCombo = new WiderDropDownCombo(items);
simpleCombo.setPreferredSize(new Dimension(180, 20));
simpleCombo.setWide(true);
JLabel label = new JLabel("Wider Drop Down Demo");
frame.getContentPane().add(simpleCombo, BorderLayout.NORTH);
frame.getContentPane().add(label, BorderLayout.SOUTH);
int width = 200;
int height = 150;
frame.setSize(width, height);
frame.setVisible(true);
}
}