2011-12-30 29 views
5

En las conexiones con estos dos post @iMohammad, Increasing/Decreasing Font Size inside textArea using JButton y Changing Font Style when Clicking on a JButton Java ..., estoy frente a la cuestión muy divertido que venía de JComboBox pasando setPrototypeDisplayValue como un argumento para JComboBox's size en la pantallaJComboBox PrototypeDisplayValue

complacer cómo puedo cambiar el tamaño me JComboBox depende dinámicamente de Font, misma que funciona correctamente por otros JComponents que he intentado en mi sscce

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class ComboBoxFontChange extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JComboBox cbox = new JComboBox(); 
    private JTextField tfield = new JTextField("Change"); 
    private JLabel label = new JLabel("Cash"); 
    private JButton button = new JButton("++ Font"); 
    private JTextField text; 
    private JPanel panel = new JPanel(); 

    public ComboBoxFontChange() { 
     super("Combo Box Font change"); 
     text = (JTextField) cbox.getEditor().getEditorComponent(); 
     cbox.addItem("Change"); 
     cbox.addItem("Cash"); 
     cbox.addItem("Font"); 
     tfield.setColumns(5); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Font font = cbox.getFont(); 
       font = font.deriveFont((float) (font.getSize2D() * 1.10)); 
       cbox.setFont(font); 
       // EDIT 
       cbox.setPrototypeDisplayValue(cbox.getSelectedItem().toString()); 
       tfield.setFont(font); 
       button.setFont(font); 
       label.setFont(font); 
       //panel.revalidate(); 
       //panel.repaint(); 
       pack(); 
      } 
     }); 
     //panel.setLayout(new GridLayout(2, 2, 10, 10)); 
     panel.add(cbox); 
     panel.add(label); 
     panel.add(tfield); 
     panel.add(button); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     add(panel); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ComboBoxFontChange frame = new ComboBoxFontChange(); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

Respuesta

4

Depuré su SSCCE, y el valor pasado a setPrototypeDisplayValue es la cadena vacía. Cambiar la línea a

cbox.setPrototypeDisplayValue(cbox.getSelectedItem()); 

Hace que todo funcione como se esperaba. La eliminación de la llamada a setPrototypDisplayValue también hace que el programa se comporte como se esperaba.

EDIT:

El otro problema es que ningún caso es despedido por el valor de presentación del prototipo porque lo establece en el valor anterior como antes, y un evento sólo se dispara si el valor cambia en realidad. Agregar cbox.setPrototypeDisplayValue(""); antes de cbox.setPrototypeDisplayValue(cbox.getSelectedItem().toString()) hace que todo se comporte como se esperaba, incluso en JDK 1.6. Estoy de acuerdo en que, dado que se cambia la fuente, se debe volver a calcular el tamaño preferido, pero al menos este cambio es una solución.

+0

por error He editado líneas de código incorrectas, manos rápidas, ahora es correcto como un ejemplo – mKorbel

+0

Explique qué debe hacer el programa y qué hace en su lugar. Todo parece funcionar como se esperaba (JDK 1.7.0_02-ea). –

+0

:-) el resto de nosotros todavía está en Java6, JComboBox todavía tiene el mismo tamaño en la pantalla – mKorbel

1

Intenté lo que dijo JB Nizet. Pero para mí el tamaño del comboBox no cambió. ¿Qué hay de tí?

Así que intenté lo siguiente y el tamaño del cuadro combinado aumentó a medida que aumentaba el tamaño de la fuente.

cbox.setFont(font); 
cbox.updateUI(); 

También elimina la línea

cbox.setPrototypeDisplayValue(text.getText()); 
+0

+1 funciona, pero hay otro problema, debe haber 'Bug', ya que' updateUI (Look and Feel) 'funciona como esperábamos, creo que este problema no tiene nada que ver con la actualización 'Look and Feel', extraño – mKorbel

+0

No use el método updateUI().Eso es por un cambio de LAF. Cambiar la fuente no es un cambio LAF. – camickr

1

Como referencia, un GridLayout y ocho clics dieron este resultado en Mac OS X:

panel.setLayout(new GridLayout(0, 1, 10, 10)); 

Combo: combo emergente: popup

Como un lado, cbox.updateUI() res modificó los valores predeterminados prescritos por el delegado de Aqua UI, com.apple.laf.AquaComboBoxUI.

+0

estuvo de acuerdo con eso sobre FlowLayout y JComboBox – mKorbel

1

Aquí es el código de la BasicComboBoxUI:

 else if (propertyName == "font") { 
      listBox.setFont(comboBox.getFont()); 
      if (editor != null) { 
       editor.setFont(comboBox.getFont()); 
      } 
      isMinimumSizeDirty = true; 
      comboBox.validate(); 
     } 
     else if (propertyName == JComponent.TOOL_TIP_TEXT_KEY) { 
      updateToolTipTextForChildren(); 
    } 
     else if (propertyName == BasicComboBoxUI.IS_TABLE_CELL_EDITOR) { 
      Boolean inTable = (Boolean)e.getNewValue(); 
    isTableCellEditor = inTable.equals(Boolean.TRUE) ? true : false; 
     } 
    else if (propertyName == "prototypeDisplayValue") { 
      isMinimumSizeDirty = true; 
      isDisplaySizeDirty = true; 
      comboBox.revalidate(); 
     } 

Por alguna razón un cambio de fuente sólo se restablece el "mínimo" no es el "tamaño de la pantalla".