# JComboBox mit mehreren Spalten



## Nathy (31. Jan 2007)

Hallo

Wie kann man eine JComboBox mit mehreren Spalten machen.

Gruss und danke


----------



## WieselAc (31. Jan 2007)

??? Kannich mir gerade nicht vorstellen was man den da klicken soll. Man kann doch trotzdem nur Zeilenweise scrollen?? 

Aber theoretisch geht das mit einem eigenen renderer. damit kann man sich einen eigenen Container da rein Packen und darauf kannst du machen wozu du lustig bist


----------



## Nathy (31. Jan 2007)

Es soll in einer Zeile mehrere Einträge geben. z.b. sind in der DB Name, Vorname, Strasse
Jetzt will ich in der Combobox 3 Spalten. 
Wie realisiere ich das?

Gruss und danke


----------



## thE_29 (31. Jan 2007)

Billige Lösung: einfach dbname, vorname und straße in einen String zusammenfügen und diese auf die combobox hauen!

bisi Bessere Lösung: eigene Klasse schreiben, welche die 3 Attribute beinhaltet und dort überschreibst das toString() und gibt die 3 Werte zurück und addest diese Objekt der JCombobox

Beste Lösung: eigene Klasse schreiben welche die 3 Attribute beinhaltet und der ComboBox einen eigenen Renderer übergeben (combobox.setRenderer)

Dann einen eigenen Renderer machen, der implements ListCellRenderer ist!

in der getComponent Methode fragst du ab, ob value instanceof deiner Klasse ist und holst dir sie die Objekte zurück!

Dann kannst du zB ein JPanel zurückgeben und auf dem addest du mit dem Gridlayout(1,3) 3 JLabels welche jeweils ein Attribut dann anzeigt! (gerade gemacht für ne JList )


----------



## Nathy (31. Jan 2007)

Hier mein Code, den ich erstellt habe.


```
public void fillResultateEintragen() {
       ComboBoxRenderer renderer= new ComboBoxRenderer();
       cmbResultateEintragenSpiel.setRenderer(renderer);
       cmbResultateEintragenSpiel.removeAllItems();
       
       sp.fillSpiele();

   }  
    class ComboBoxRenderer extends JPanel implements ListCellRenderer {

        JLabel left = new JLabel();
        JLabel right = new JLabel();

        public ComboBoxRenderer()
        {
        setLayout(new GridLayout(1,2));

        left.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.white));
        left.setHorizontalAlignment(JLabel.CENTER);
        left.setVerticalAlignment(JLabel.CENTER);

        right.setBorder(BorderFactory.createMatteBorder(0, 1, 0, 0, Color.darkGray));
        right.setHorizontalAlignment(JLabel.CENTER);
        right.setVerticalAlignment(JLabel.CENTER);

        add(left);
        add(right);
        }

        public Component getListCellRendererComponent(JList list,Object value,int index,boolean isSelected,boolean cellHasFocus) {

        if (isSelected) {
            setBackground(list.getSelectionBackground());
            setForeground(list.getSelectionForeground());
        } else {
            setBackground(list.getBackground());
            setForeground(list.getForeground());
        }

        boolean valid = false;
        if (value instanceof Object[])
        {
            
            Object columns[] = (Object[])value;
            if (columns.length == 3)
            {
                valid = true;
                left.setText(""+columns[0]);
                right.setText(""+columns[1]);
            }
        }
        if (!valid)
        {
            left.setText("invalid");
            right.setText("invalid");
        }

        return this;
}
```

Damit erhalte ich jetzt eine JComboBox mit 2 Spalten.
Wie kann ich aber diese Spalten jetzt füllen?

Gruss und danke


----------



## thE_29 (31. Jan 2007)

probiere ein this.validate(); this.repaint();

eigentlich sollte er dir was anzeigen!

Also entweder invalid oder den Inhalt vom value Objekt!


----------



## Nathy (31. Jan 2007)

Ich erhalte den Ivalid-Eintrag.
Wie kann ich aber jetzt einen neuen Eintrag hinzufügen.
Mit cmbResultateEintragenSpiel.addItem() funktioniert es mir nicht. Was mache ich falsch?


----------



## thE_29 (31. Jan 2007)

Doch, müsste mit addItem und dort musst du ein object[] übergeben!

Müsste so gehen! Ansonsten mache ein kleines Bsp mit dem ich auch testen kann!


----------



## Nathy (31. Jan 2007)

Hier mein Code.
Kann mir bitte jemand zeigen, wie ich jetzt dort ein String hinzufügen kann?


```
package testgui;

import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import javax.swing.*;

public class GUI extends javax.swing.JFrame {
    
    /** Creates new form GUI */
    public GUI() {
        initComponents();
    }

    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                          
    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        jComboBox1 = new javax.swing.JComboBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(java.awt.event.WindowEvent evt) {
                formWindowOpened(evt);
            }
        });

        jComboBox1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jComboBox1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 202, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(19, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(69, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(159, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(189, Short.MAX_VALUE))
        );
        pack();
    }// </editor-fold>                        

    private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  
    fillResultateEintragen();
    }                                 

    private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        
    }                                          
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new GUI().setVisible(true);
            }
        });
    }
    public void fillResultateEintragen() {

       ComboBoxRenderer renderer= new ComboBoxRenderer();
       jComboBox1.setRenderer(renderer);
       jComboBox1.removeAllItems();
   } 
    
     class ComboBoxRenderer extends JPanel implements ListCellRenderer {

        JLabel left = new JLabel();
        JLabel mh = new JLabel();
        JLabel ma = new JLabel();

        public ComboBoxRenderer()
        {
        setLayout(new GridLayout(1,3));

        left.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.white));
        left.setHorizontalAlignment(JLabel.CENTER);
        left.setVerticalAlignment(JLabel.CENTER);

        mh.setBorder(BorderFactory.createMatteBorder(0, 1, 0, 0, Color.darkGray));
        mh.setHorizontalAlignment(JLabel.CENTER);
        mh.setVerticalAlignment(JLabel.CENTER);
        
        ma.setBorder(BorderFactory.createMatteBorder(0, 1, 0, 0, Color.darkGray));
        ma.setHorizontalAlignment(JLabel.CENTER);
        ma.setVerticalAlignment(JLabel.CENTER);

        add(left);
        add(mh);
        add(ma);
        }

        public Component getListCellRendererComponent(JList list,Object value,int index,boolean isSelected, boolean cellHasFocus) 
        {
        if (isSelected) {
            setBackground(list.getSelectionBackground());
            setForeground(list.getSelectionForeground());
        } else {
            setBackground(list.getBackground());
            setForeground(list.getForeground());
        }

        boolean valid = false;
        if (value instanceof Object[])
        {
            Object columns[] = (Object[])value;
            if (columns.length == 3)
            {
                valid = true;
                left.setText("Datum/Zeit");
                mh.setText("Heim");
                ma.setText("Gast");
            }
        }
        if (!valid)
        {
            left.setText("invalid");
            mh.setText("invalid");
            ma.setText("invalid");
        }

        return this;
        }
}
    
    // Variables declaration - do not modify                     
    private javax.swing.JComboBox jComboBox1;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration                   
    
}
```


----------



## thE_29 (31. Jan 2007)

Ist hier schon jeder mit java 6 am Start oder wie sieht das ?!

Ich habe net mal java5 (bzw entwickle net explizit für 1.5)


----------



## Nathy (31. Jan 2007)

Hallo

Sorry. Hier der Code mit Java 1.5
Hoffe jemand kann mir sage, wie ich jetzt dort Einträge hinzufügen kann.

```
/*
 * GUI2.java
 *
 * Created on 31. Januar 2007, 15:35
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

/**
 *
 * @author Nathan Burgener
 */
package testgui;

import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import javax.swing.*;

public class GUI2 extends JFrame {
    
    /** Creates new form GUI */
    public GUI2() {
        initComponents();
    }

    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                          
    private void initComponents() {
        JPanel jPanel1 = new JPanel();
        JComboBox jComboBox1 = new JComboBox();
        JFrame myFrame = new JFrame();
        
        jPanel1.add(jComboBox1);
        myFrame.add(jPanel1);
        myFrame.setVisible(true);
        myFrame.pack();
    }// </editor-fold>                        

    private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  
    fillResultateEintragen();
    }                                 

    private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        
    }                                          
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new GUI().setVisible(true);
            }
        });
    }
    public void fillResultateEintragen() {

       ComboBoxRenderer renderer= new ComboBoxRenderer();
       jComboBox1.setRenderer(renderer);
       jComboBox1.removeAllItems();
   } 
    
     class ComboBoxRenderer extends JPanel implements ListCellRenderer {

        JLabel left = new JLabel();
        JLabel mh = new JLabel();
        JLabel ma = new JLabel();

        public ComboBoxRenderer()
        {
        setLayout(new GridLayout(1,3));

        left.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.white));
        left.setHorizontalAlignment(JLabel.CENTER);
        left.setVerticalAlignment(JLabel.CENTER);

        mh.setBorder(BorderFactory.createMatteBorder(0, 1, 0, 0, Color.darkGray));
        mh.setHorizontalAlignment(JLabel.CENTER);
        mh.setVerticalAlignment(JLabel.CENTER);
        
        ma.setBorder(BorderFactory.createMatteBorder(0, 1, 0, 0, Color.darkGray));
        ma.setHorizontalAlignment(JLabel.CENTER);
        ma.setVerticalAlignment(JLabel.CENTER);

        add(left);
        add(mh);
        add(ma);
        }

        public Component getListCellRendererComponent(JList list,Object value,int index,boolean isSelected, boolean cellHasFocus) 
        {
        if (isSelected) {
            setBackground(list.getSelectionBackground());
            setForeground(list.getSelectionForeground());
        } else {
            setBackground(list.getBackground());
            setForeground(list.getForeground());
        }

        boolean valid = false;
        if (value instanceof Object[])
        {
            Object columns[] = (Object[])value;
            if (columns.length == 3)
            {
                valid = true;
                left.setText("Datum/Zeit");
                mh.setText("Heim");
                ma.setText("Gast");
            }
        }
        if (!valid)
        {
            left.setText("invalid");
            mh.setText("invalid");
            ma.setText("invalid");
        }

        return this;
        }
}
    
    // Variables declaration - do not modify                     
    private javax.swing.JComboBox jComboBox1;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration                   
    
}
```


----------



## thE_29 (31. Jan 2007)

zB so etwa:

jComboBox1.addItem(new Object[]{"BLA","BLA2","BLA3"});


Nachtrag: ich würds aber mit einer eigenen Klasse lösen, die eben diese 3 Werte hat!

Dann fragst du ab auf instanceof DeineKlasse und holst dir dann die Objekte zurück!


Adden tust du halt mit jComboBox1.addItem( new DeineKlasse("BLa","BLA2","BLA3"));


----------



## Nathy (31. Jan 2007)

Ok. Aber wie kann ich es jetzt realisieren, dass auch BLA, BLA2 und BLA3 angezeigt wird und nicht wie in diesem Beispiel: Datum/Zeit, Heim, Gast?

Gruss und danke


----------



## thE_29 (31. Jan 2007)

```
if (columns.length == 3)
            {
                valid = true;
                left.setText("Datum/Zeit");
                mh.setText("Heim");
                ma.setText("Gast");
            }
```


einfach ändern ihn


```
if (columns.length == 3)
            {
                valid = true;
                left.setText(columns[0]);
                mh.setText(columns[1]);
                ma.setText(columns[2]);
            }
```

Das wars


----------



## Nathy (31. Jan 2007)

Super jetzt funktioniert es schon mal nicht schlecht.
Weiss vielleicht jemand noch, wie man die Grösse der Spalten ändern kann. z.b. das die erste Spalte nicht so lang ist wie die anderen.

Gruss und danke


----------



## Gast (31. Jan 2007)

Entwerder nimmst du einen anderen Layout manager oder du setzt den Labeln eine fixe Größe oder du fügst eine leere Border hinzu oder, oder, oder


----------



## thE_29 (1. Feb 2007)

Jo, einfach mal den Labels eine größe mit setPreferredSize setzen!


----------



## Nathy (1. Feb 2007)

Ok versuche ich.
Danke für die Hilfe


----------



## Nathy (1. Feb 2007)

Hallo

Habe es nun folgendermassen versucht:
spNr.setSize(30,20);
oder mit 
spNr.setPreferredSize(new Dimension(30,20));

Bei setSize() geschieht überhaupt nichts. Bei setPreferredSize() wird die Höhe geändert. Jedoch kann ich die Länge nicht ändern. 
Warum das?

Gruss und danke


----------



## thE_29 (2. Feb 2007)

Mhm.. probier dann mal die Methode getPreferredSize überschreiben!


----------



## Nathy (5. Feb 2007)

Hallo

Wie soll ich das genau machen?
Habe keine Ahnung.

Gruss und danke


----------



## thE_29 (6. Feb 2007)

zB so


```
JLabel label = new JLabel(){
public Dimension getPreferredSize()
{
   return new Dimension(120,25);
}});
```


----------

