2013-05-09 12 views
5

Mi piacerebbe sapere come modificare il carattere per il valore visualizzato/selezionato in un JComboBox. PER ESEMPIO.Font personalizzato per JComboBox

La resa superiore del Aharoni (immagine cortesia della this answer).

posso cambiare i valori della lista con un renderer come questo:

public class JComboBoxItalic extends BasicComboBoxRenderer { 
    protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer(); 

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     Font theFont = null; 
     JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index, isSelected,cellHasFocus); 
     theFont = new Font("Courier", Font.ITALIC, 14); 
     renderer.setFont(theFont); 
     return renderer; 
    } 
} 

Ma questo non pregiudica il valore selezionato quando la scatola è chiusa. Qualche idea?

+0

Utilizzare invece Html per manipolare il tipo di carattere e la dimensione .. Basta una sugegsione. – ErrorNotFoundException

+1

@Stanley * "Solo una suggezione" * Non molto buono. Inserendo le stringhe HTML come valori, invece di recuperare valori come 'Apple' otteniamo' Apple' - orribile abuso dell'API. –

+0

se ogni elemento contiene variabili 'how-to-display' allora perché non cambiare semplicemente le variabili 'how-to-display'? – Infested

risposta

4
  • non riesco a vedere qualcosa di sbagliato, questione deve essere nel resto del codice

  • renderer viene applicata solo per la voce (se è visibile) finestra pop-up,

  • voi può utilizzare il renderer di base e più semplice

  • si può ignorare il tutto da paramaters da púaramaters - elenco JList, Object value, int index, booleano isSelected, cellHasFocus booleano, ogni sono impostabile, controllabile ..., separatelly

.

private class ComboBoxRenderer extends DefaultListCellRenderer { 

    private static final long serialVersionUID = 1L; 
    private Font baseFont = new JLabel("Test").getFont(); 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, 
      int index, boolean isSelected, boolean cellHasFocus) { 

     super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
     //if (value instanceof Font) { 
     // Font font = (Font) value; 
     // setFont(new Font(font.getName(), baseFont.getStyle(), baseFont.getSize())); 
       setFont(new Font("Courier", Font.ITALIC, 14)); 
     //} 
     return this; 
    } 
} 

EDIT

vorrei che per sapere come cambiare il tipo di carattere per la visualizzata/valore selezionato in un JComboBox

.

enter image description here

.

enter image description here

.

enter image description here

.

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GraphicsEnvironment; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import javax.swing.DefaultListCellRenderer; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JPopupMenu; 
import javax.swing.JScrollPane; 
import javax.swing.JViewport; 
import javax.swing.plaf.basic.BasicComboBoxRenderer; 

public class SystemFontDisplayer extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JComboBox fontsBox; 

    public SystemFontDisplayer() { 

     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     String[] fontFamilyNames = ge.getAvailableFontFamilyNames(); 
     fontsBox = new JComboBox(fontFamilyNames); 
     fontsBox.setSelectedItem(0); 
     fontsBox.setRenderer(new ComboRenderer(fontsBox)); 
     fontsBox.addItemListener(new ItemListener() { 

      @Override 
      public void itemStateChanged(ItemEvent e) { 
       if (e.getStateChange() == ItemEvent.SELECTED) { 
        final String fontName = fontsBox.getSelectedItem().toString(); 
        fontsBox.setFont(new Font(fontName, Font.PLAIN, 16)); 
       } 
      } 
     }); 
     fontsBox.setSelectedItem(0); 
     fontsBox.getEditor().selectAll(); 
     add(fontsBox, BorderLayout.CENTER); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setPreferredSize(new Dimension(400, 60)); 
     setLocation(200, 105); 
     pack(); 

     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       fontsBox.setPopupVisible(true); 
       fontsBox.setPopupVisible(false); 
      } 
     }); 
     setVisible(true); 
    } 

    public static void main(String arg[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       SystemFontDisplayer systemFontDisplayer = new SystemFontDisplayer(); 
      } 
     }); 
    } 

    private class ComboRenderer extends BasicComboBoxRenderer { 

     private static final long serialVersionUID = 1L; 
     private JComboBox comboBox; 
     final DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer(); 
     private int row; 

     private ComboRenderer(JComboBox fontsBox) { 
      comboBox = fontsBox; 
     } 

     private void manItemInCombo() { 
      if (comboBox.getItemCount() > 0) { 
       final Object comp = comboBox.getUI().getAccessibleChild(comboBox, 0); 
       if ((comp instanceof JPopupMenu)) { 
        final JList list = new JList(comboBox.getModel()); 
        final JPopupMenu popup = (JPopupMenu) comp; 
        final JScrollPane scrollPane = (JScrollPane) popup.getComponent(0); 
        final JViewport viewport = scrollPane.getViewport(); 
        final Rectangle rect = popup.getVisibleRect(); 
        final Point pt = viewport.getViewPosition(); 
        row = list.locationToIndex(pt); 
       } 
      } 
     } 

     @Override 
     public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
      super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
      if (list.getModel().getSize() > 0) { 
       manItemInCombo(); 
      } 
      final JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, row, isSelected, cellHasFocus); 
      final Object fntObj = value; 
      final String fontFamilyName = (String) fntObj; 
      setFont(new Font(fontFamilyName, Font.PLAIN, 16)); 
      return this; 
     } 
    } 
} 
+1

Grazie! fontsBox.setFont (nuovo Font (fontName, Font.PLAIN, 16)); Ha fatto la cosa! : D – Grains

+0

siete i benvenuti – mKorbel

+0

Questo non ha funzionato per me, ha annullato tutto nella lista a discesa. – 2rs2ts