From fbfde043b3ba54442c0ce3b9e24c68286b1ab96b Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 26 Sep 2019 10:35:19 +0200 Subject: [PATCH] ComboBox: made popup list wider if list item texts are longer than combo box width --- .../com/formdev/flatlaf/ui/FlatComboBoxUI.java | 16 ++++++++++++++++ .../com/formdev/flatlaf/FlatComponentsTest.java | 11 +++++++++++ .../com/formdev/flatlaf/FlatComponentsTest.jfd | 13 +++++++++++++ .../flatlaf/demo/BasicComponentsPanel.java | 11 +++++++++++ .../flatlaf/demo/BasicComponentsPanel.jfd | 13 +++++++++++++ 5 files changed, 64 insertions(+) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java index 103751f0..e55cab77 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java @@ -341,6 +341,22 @@ public class FlatComboBoxUI super( combo ); } + @Override + protected Rectangle computePopupBounds( int px, int py, int pw, int ph ) { + // get maximum display size of all items, ignoring prototype value + Object prototype = comboBox.getPrototypeDisplayValue(); + if( prototype != null ) + comboBox.setPrototypeDisplayValue( null ); + Dimension displaySize = getDisplaySize(); + if( prototype != null ) + comboBox.setPrototypeDisplayValue( prototype ); + + // make popup wider if necessary + pw = Math.max( pw, displaySize.width ); + + return super.computePopupBounds( px, py, pw, ph ); + } + @Override protected void configurePopup() { super.configurePopup(); diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.java index 857da32a..684dcbf9 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.java @@ -75,6 +75,7 @@ public class FlatComponentsTest JComboBox comboBox2 = new JComboBox<>(); JComboBox comboBox3 = new JComboBox<>(); JComboBox comboBox4 = new JComboBox<>(); + JComboBox comboBox5 = new JComboBox<>(); JLabel spinnerLabel = new JLabel(); JSpinner spinner1 = new JSpinner(); JSpinner spinner2 = new JSpinner(); @@ -365,6 +366,16 @@ public class FlatComponentsTest comboBox4.setEnabled(false); add(comboBox4, "cell 4 5,growx"); + //---- comboBox5 ---- + comboBox5.setPrototypeDisplayValue("12345"); + comboBox5.setModel(new DefaultComboBoxModel<>(new String[] { + "wide popup if text is longer", + "aa", + "bbb", + "cccc" + })); + add(comboBox5, "cell 5 5,growx"); + //---- spinnerLabel ---- spinnerLabel.setText("JSpinner:"); add(spinnerLabel, "cell 0 6"); diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.jfd b/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.jfd index a9c09aff..49447ece 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.jfd +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.jfd @@ -240,6 +240,19 @@ new FormModel { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 4 5,growx" } ) + add( new FormComponent( "javax.swing.JComboBox" ) { + name: "comboBox5" + "prototypeDisplayValue": "12345" + "model": new javax.swing.DefaultComboBoxModel { + selectedItem: "wide popup if text is longer" + addElement( "wide popup if text is longer" ) + addElement( "aa" ) + addElement( "bbb" ) + addElement( "cccc" ) + } + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 5 5,growx" + } ) add( new FormComponent( "javax.swing.JLabel" ) { name: "spinnerLabel" "text": "JSpinner:" diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.java index 0bcf955c..820f79b6 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.java @@ -54,6 +54,7 @@ class BasicComponentsPanel JComboBox comboBox2 = new JComboBox<>(); JComboBox comboBox3 = new JComboBox<>(); JComboBox comboBox4 = new JComboBox<>(); + JComboBox comboBox5 = new JComboBox<>(); JLabel spinnerLabel = new JLabel(); JSpinner spinner1 = new JSpinner(); JSpinner spinner2 = new JSpinner(); @@ -264,6 +265,16 @@ class BasicComponentsPanel comboBox4.setEnabled(false); add(comboBox4, "cell 4 4,growx"); + //---- comboBox5 ---- + comboBox5.setPrototypeDisplayValue("12345"); + comboBox5.setModel(new DefaultComboBoxModel<>(new String[] { + "wide popup if text is longer", + "aa", + "bbb", + "cccc" + })); + add(comboBox5, "cell 5 4,growx"); + //---- spinnerLabel ---- spinnerLabel.setText("JSpinner:"); add(spinnerLabel, "cell 0 5"); diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.jfd b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.jfd index 3faef8c0..d6ad5c75 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.jfd +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.jfd @@ -199,6 +199,19 @@ new FormModel { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 4 4,growx" } ) + add( new FormComponent( "javax.swing.JComboBox" ) { + name: "comboBox5" + "prototypeDisplayValue": "12345" + "model": new javax.swing.DefaultComboBoxModel { + selectedItem: "wide popup if text is longer" + addElement( "wide popup if text is longer" ) + addElement( "aa" ) + addElement( "bbb" ) + addElement( "cccc" ) + } + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 5 4,growx" + } ) add( new FormComponent( "javax.swing.JLabel" ) { name: "spinnerLabel" "text": "JSpinner:"