Fix JComboBox width

12,737

Solution 1

Finally I found an easy solution:

jComboBox1.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXX");

And works perfect for what I wanted

Solution 2

NetBeans does this for you with a couple of checkboxes in the component's right-click context menu: Auto Resizing -> Horizontal and Vertical.

I turned them off and compared the NetBeans generated code in my revision control history. There were a surprising number of changes that I could not relate to the size of the component but I did see changes in how the combo box was added to it's containing layout group. essentially,

....addComponent(destinationFolderComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

was changed to

....addComponent(myComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 514, javax.swing.GroupLayout.PREFERRED_SIZE)

JComboBox.setPreferredSize() is never explicitly called, so I assume you get better results from telling the layout manager the preferred size and re-size properties, rather than telling the JComboBox and hoping the layout manager reads those properties behind the scenes.

(by the way, by ....addComponent(), I mean addComponent() is called in a long, cascaded sequence of createParallelGroup() and createSequentialGroup(), starting with a new javax.swing.GroupLayout(myPanel). I presented the short form above because I didn't want to get into the nitty gritty of auto-generated NetBeans code, which I could not begin to write manually or explain. You want the whole thing? You can't handle the whole thing! here it is:

    javax.swing.GroupLayout taskPanelLayout = new javax.swing.GroupLayout(taskPanel);
    taskPanel.setLayout(taskPanelLayout);
    taskPanelLayout.setHorizontalGroup(
        taskPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(taskPanelLayout.createSequentialGroup()
            .addContainerGap()
            .addGroup(taskPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, taskPanelLayout.createSequentialGroup()
                    .addGroup(taskPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jScrollPane1)
                        .addGroup(taskPanelLayout.createSequentialGroup()
                            .addGroup(taskPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addComponent(tagModifierLabel, javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.LEADING))
                            .addGap(18, 18, 18)
                            .addGroup(taskPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(destinationFolderComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 514, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(tagModifierTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 514, javax.swing.GroupLayout.PREFERRED_SIZE))))
                    .addGap(18, 18, 18)
                    .addGroup(taskPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(importFilesButton)
                        .addComponent(selectFilesButton)
                        .addComponent(clearFilesListButton)
                        .addComponent(commitChangesButton)))
                .addGroup(taskPanelLayout.createSequentialGroup()
                    .addComponent(importFilesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 103, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGap(0, 0, Short.MAX_VALUE)))
            .addContainerGap())
    );

)

Share:
12,737
Roman Rdgz
Author by

Roman Rdgz

Telecom Engineer

Updated on June 04, 2022

Comments

  • Roman Rdgz
    Roman Rdgz about 2 years

    I have a JComboBox with some options. When I make a selection at another component, I'm changing JComboBox contents. First I call the removeAllItems() method, and then I add one by one the Strings I need now.

    The problem is, by default I had some options, and one of them was the larger text, so JComboBox got the width it needed to show that option correctly. When I change the JComboBox contents, that text option is gone, and now a smaller text is giving the width to the JComboBox, so when I change contents it gets smaller.

    My first approach was calling myComboBox.setPreferredSize(myComboBox.getSize()) and then its dimensions are fixed, but not correctly: it gets a bit smaller in height and width. I think it is because I'm using Nimbus Look&Feel, and the dimensions I'm getting from the getSize() method are the ones given by the Java default Look%Feel.

    I also tried myCombo.setPreferredSize(new Dimension(myCombo.getHeight(), myCombo.getWidth())) with same results.

    How can I approach this problem?

    I add a code example of how I'm using the Layout:

        private String[] comboEventDOutputStrings = { "Run", "Stop", "Pause", "Conditioning time", "Deposition time", "Equilibration time", "Measurement time"};
        private String[] comboEventDInputStrings = { "Run", "Stop", "Pause"};
        // The first String array is the default set of values. It's obvious that the JComboBox will get smaller
        // when I change to the second array of contents
    
            //...   
                JPanel pane = new JPanel(new GridBagLayout());
                JPanel jPanelExterno = new JPanel(new GridBagLayout());
                GridBagConstraints cExterna = new GridBagConstraints();
                GridBagConstraints c = new GridBagConstraints();
                Border loweredetched = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
                jPanelExterno.setBorder(loweredetched);
                jPanelExterno.setName("");
    
                cExterna.fill = GridBagConstraints.BOTH;
                cExterna.anchor = GridBagConstraints.NORTH;
                cExterna.gridx = 0;
                cExterna.gridy = 0;
                cExterna.insets = new Insets(10,10,5,5);
    
                    JPanel jPanel1 = new JPanel(new GridBagLayout());
                    jPanel1.setBorder(loweredetched);
                    jPanel1.setName("PIO 1");
    
                    jCheckBox1 = new JCheckBox("Enable");
                    jCheckBox1.setSelected(false);
                    jCheckBox1.setName("1");
                    jCheckBox1.addActionListener(new PIOCheckListener());
    
                    c.fill = GridBagConstraints.BOTH;
                    c.anchor = GridBagConstraints.NORTH;
                    c.gridx = 0;
                    c.gridy = 0;
                    c.insets = new Insets(10,5,10,10);
                    jPanel1.add(jCheckBox1, c);
    
                    c.gridy++;
                    c.insets = new Insets(5,10,5,5);
                    JLabel label1 = new JLabel("IO Type");
                    jPanel1.add(label1, c);
                    c.gridx++;
                    c.insets = new Insets(5,5,5,10);
    
                    combo1 = new JComboBox(comboIOTypeStrings);
                    combo1.setEnabled(false);
                    combo1.setSelectedIndex(0);
                    combo1.setName("1");
                    combo1.addActionListener (new PIOComboListener());
                    jPanel1.add(combo1, c);
    
                    c.gridy++;
                    c.insets = new Insets(5,10,5,5);
                    c.gridx=0;
                    JLabel label2 = new JLabel("Active level");
                    jPanel1.add(label2, c);
                    c.gridx++;
                    c.insets = new Insets(5,5,5,10);
    
                    combo2 = new JComboBox(comboActiveLevelStrings);
                    combo2.setEnabled(false);
                    combo2.setSelectedIndex(0);
                    jPanel1.add(combo2, c);
    
                    c.gridy++;
                    c.insets = new Insets(5,10,5,5);
                    c.gridx=0;
                    JLabel label3 = new JLabel("Event");
                    jPanel1.add(label3, c);
                    c.gridx++;
                    c.insets = new Insets(5,5,10,10);
    
                    combo3 = new JComboBox(comboEventDOutputStrings);
                    combo3.setEnabled(false);
                    combo3.setSelectedIndex(0);
                    jPanel1.add(combo3, c);
    
                    c.gridy++;
                    c.insets = new Insets(5,10,5,5);
                    c.gridx=0;
                    JLabel label4 = new JLabel("Node");
                    jPanel1.add(label4, c);
                    c.gridx++;
                    c.insets = new Insets(5,5,10,10);
    
                    combo4 = new JComboBox(comboNodeStrings);
                    combo4.setEnabled(false);
                    combo4.setSelectedIndex(0);
                    jPanel1.add(combo4, c);
    
                jPanelExterno.add(jPanel1, cExterna);
    
            pioDialog.add(pane);
            pioDialog.pack();
            pioDialog.setLocationRelativeTo(null);
            pioDialog.setVisible(true);
        //...
    }   
    
    
        class PIOComboListener implements ActionListener{
    
            @Override
            public void actionPerformed(ActionEvent a) {
                JComboBox cb = (JComboBox)a.getSource();
                JComboBox target1 = null;
                JComboBox target2 = null;
                JComboBox target3 = null;
                switch(Integer.parseInt(cb.getName())){
                    case 1:
                        target1 = combo2;
                        target2 = combo3;
                        target3 = combo4;
                        break;
                    default:
                        Register.debug("PIODialog error: No target for comboBoxes");
                        break;
                }
    
                if(cb.getSelectedIndex()==2){ //Analog input
                    target1.setEnabled(false);
                    target2.setEnabled(false);
                    target3.setEnabled(false);
                }
                else{
                    target1.setEnabled(true);
                    target2.setEnabled(true);
                    target3.setEnabled(true);
                    target2.removeAllItems();
                    if(cb.getSelectedIndex()==0){
                        for(int i=0; i<comboEventDOutputStrings.length; i++)
                            target2.addItem(comboEventDOutputStrings[i]);
                    } else {
                        for(int i=0; i<comboEventDInputStrings.length; i++)
                            target2.addItem(comboEventDInputStrings[i]);
                    }
                }
    
            }
        }
    

    It's basically a GridBagLayout with 6 JPanel with a new GridBagLayout for each one of them. I just wrote jPanel1 here to simplify things. I hope it is not very messy.