Problem beim vergrößern des JComboBox Popup's (nur beim GridBagLayout)

mad_dark_angel

Grünschnabel
Hey Leute,
Ich habe folgendes Problem:
Ich will eine JComboBox die eine bestimmte breite hat und sich nicht dem längstem Item anpasst (erledigt)
Anschließend soll das Popup wenn man es öffnet groß genug sein um die Items in voller länge sehen zu können (erledigt, mit PopupListener-"Hack")
Nun kommt mein Problem: Das Popup ist zwar an sich größer, aber die Items in dem Popup samt Scrollbar (dem JScrollPane aus dem PopupMenu) werden trotzdem nicht größer! Das ganze hängt nur mit dem GridBagLayout zusammen, also mit der Breite der Zelle!
ohne GridBagLayout funktioniert das ganze, kann mir wer helfen das auch für das GridBagLayout zum laufen zu bekommen? Wie gesagt das Problem liegt an der Zellen-Breite, da die Items exakt immernoch die breite der Zelle haben!

Ist relativ schwer zu verstehen, deswegen hier ein Beispiel: (nach ausführen sollte es sofort selbsterklärend sein)

vielen Dank im Vorraus Leute!

Code:
import javax.swing.*;
import javax.swing.event.PopupMenuListener;
import javax.swing.event.PopupMenuEvent;
import java.awt.*;
import java.util.Vector;


public class Test extends JFrame implements PopupMenuListener{
    public JPanel        panel    = new JPanel();
    public GridBagLayout gbl      = new GridBagLayout();

    public Vector<String> vecValues  = new Vector<String>();
    public JLabel         labelName  = new JLabel("Blubb");
    public JComboBox      comboBox1  = new JComboBox(vecValues);

    public Test() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        for(int i = 0; i < 20; i++)
            vecValues.addElement(i + "cccccccccccccccccccccccccccc");

        labelName.setPreferredSize(new Dimension(100, (int) labelName.getPreferredSize().getHeight()));
        comboBox1.setPrototypeDisplayValue(0);
        comboBox1.setSelectedIndex(0);

        panel.setLayout(gbl);
        getContentPane().add(panel);

        addComponent(panel, gbl, labelName  , 0, 0, 1, 1, 1.0, 1.0, 10, 10, 10, 10);
        addComponent(panel, gbl, comboBox1  , 0, 1, 1, 1, 0.0, 0.0, 10, 10, 10, 10);

        comboBox1.addPopupMenuListener(this);

        pack();
    }

    public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
        JComboBox box = (JComboBox) e.getSource();
        Object comp = box.getUI().getAccessibleChild(box, 0);
        if (!(comp instanceof JPopupMenu)) return;
        JComponent scrollPane = (JComponent) ((JPopupMenu) comp).getComponent(0);
        Dimension size = new Dimension();
        size.width = 200;
        size.height = scrollPane.getPreferredSize().height;
        scrollPane.setPreferredSize(size);
    }
    public void popupMenuWillBecomeInvisible(PopupMenuEvent event) {}
    public void popupMenuCanceled(PopupMenuEvent event) {}

    private void addComponent(Container cont, GridBagLayout gbl, Component c, int x, int y, int width, int height, double weightx, double weighty, int ... iInsets) {
        int[] insets = new int[]{0, 0, 0, 0};

        if(iInsets.length > 4) {
            throw new IllegalArgumentException("max 4 parameters allowed for iInsets");
        }
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH; // wie Komponente Bereich füllen soll
        gbc.gridx = x;            // x-Position
        gbc.gridy = y;            // <-Position
        gbc.gridwidth = width;    // Breite
        gbc.gridheight = height;  // Höhe
        gbc.weightx = weightx;
        gbc.weighty = weighty;
        System.arraycopy(iInsets, 0, insets, 0, iInsets.length);
        gbc.insets = new Insets(insets[0], insets[1], insets[2], insets[3]); // Abstände definieren
        gbl.setConstraints(c, gbc);
        cont.add(c);
    }

    public static void main (String args[]) {
        new Test();
    }
}
 
jo genau das wollte ich eigentlich verhindern... wollte eigentlich dafür nich extra dem Model umschreiben...
hmm schau ich mir aber gleich mal an
 
Zurück