1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

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

Dieses Thema im Forum "Swing, Java2D/3D, SWT, JFace" wurde erstellt von mad_dark_angel, 22. April 2006.

  1. mad_dark_angel

    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 (Text):
    1.  
    2. import javax.swing.*;
    3. import javax.swing.event.PopupMenuListener;
    4. import javax.swing.event.PopupMenuEvent;
    5. import java.awt.*;
    6. import java.util.Vector;
    7.  
    8.  
    9. public class Test extends JFrame implements PopupMenuListener{
    10.     public JPanel        panel    = new JPanel();
    11.     public GridBagLayout gbl      = new GridBagLayout();
    12.  
    13.     public Vector<String> vecValues  = new Vector<String>();
    14.     public JLabel         labelName  = new JLabel("Blubb");
    15.     public JComboBox      comboBox1  = new JComboBox(vecValues);
    16.  
    17.     public Test() {
    18.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    19.         setVisible(true);
    20.  
    21.         for(int i = 0; i < 20; i++)
    22.             vecValues.addElement(i + "cccccccccccccccccccccccccccc");
    23.  
    24.         labelName.setPreferredSize(new Dimension(100, (int) labelName.getPreferredSize().getHeight()));
    25.         comboBox1.setPrototypeDisplayValue(0);
    26.         comboBox1.setSelectedIndex(0);
    27.  
    28.         panel.setLayout(gbl);
    29.         getContentPane().add(panel);
    30.  
    31.         addComponent(panel, gbl, labelName  , 0, 0, 1, 1, 1.0, 1.0, 10, 10, 10, 10);
    32.         addComponent(panel, gbl, comboBox1  , 0, 1, 1, 1, 0.0, 0.0, 10, 10, 10, 10);
    33.  
    34.         comboBox1.addPopupMenuListener(this);
    35.  
    36.         pack();
    37.     }
    38.  
    39.     public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
    40.         JComboBox box = (JComboBox) e.getSource();
    41.         Object comp = box.getUI().getAccessibleChild(box, 0);
    42.         if (!(comp instanceof JPopupMenu)) return;
    43.         JComponent scrollPane = (JComponent) ((JPopupMenu) comp).getComponent(0);
    44.         Dimension size = new Dimension();
    45.         size.width = 200;
    46.         size.height = scrollPane.getPreferredSize().height;
    47.         scrollPane.setPreferredSize(size);
    48.     }
    49.     public void popupMenuWillBecomeInvisible(PopupMenuEvent event) {}
    50.     public void popupMenuCanceled(PopupMenuEvent event) {}
    51.  
    52.     private void addComponent(Container cont, GridBagLayout gbl, Component c, int x, int y, int width, int height, double weightx, double weighty, int ... iInsets) {
    53.         int[] insets = new int[]{0, 0, 0, 0};
    54.  
    55.         if(iInsets.length > 4) {
    56.             throw new IllegalArgumentException("max 4 parameters allowed for iInsets");
    57.         }
    58.         GridBagConstraints gbc = new GridBagConstraints();
    59.         gbc.fill = GridBagConstraints.BOTH; // wie Komponente Bereich füllen soll
    60.         gbc.gridx = x;            // x-Position
    61.         gbc.gridy = y;            // <-Position
    62.         gbc.gridwidth = width;    // Breite
    63.         gbc.gridheight = height;  // Höhe
    64.         gbc.weightx = weightx;
    65.         gbc.weighty = weighty;
    66.         System.arraycopy(iInsets, 0, insets, 0, iInsets.length);
    67.         gbc.insets = new Insets(insets[0], insets[1], insets[2], insets[3]); // Abstände definieren
    68.         gbl.setConstraints(c, gbc);
    69.         cont.add(c);
    70.     }
    71.  
    72.     public static void main (String args[]) {
    73.         new Test();
    74.     }
    75. }
    76.  
  2. elmato

    elmato Grünschnabel

  3. mad_dark_angel

    mad_dark_angel Grünschnabel

    jo genau das wollte ich eigentlich verhindern... wollte eigentlich dafür nich extra dem Model umschreiben...
    hmm schau ich mir aber gleich mal an

Diese Seite empfehlen