2013-05-09 22 views
5

Ich würde gerne wissen, wie Sie die Schriftart für den angezeigten/ausgewählten Wert in einem JComboBox ändern. Z.B.Benutzerdefinierte Schriftart für JComboBox

Das obere Rendering von Aharoni (freundlicher Genehmigung von this answer).

Ich kann die Liste Werte ändern mit einem Renderer wie folgt aus:

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; 
    } 
} 

Aber dies hat keinen Einfluss auf den gewählten Wert , wenn die Box geschlossen ist. Irgendwelche Ideen?

+0

Verwenden Sie stattdessen Html, um die Schriftart und Größe zu ändern .. Nur eine sugegstion. – ErrorNotFoundException

+1

@Stanley * "Nur eine Suggestion" * Nicht sehr gut. Indem wir HTML-Strings als Werte setzen, anstatt Werte wie "Apple" zurück zu bekommen, erhalten wir ' Apple' - schrecklicher Missbrauch der API. –

+0

Wenn jedes Element eine 'how-to-display'-Variable enthält, dann ändern Sie einfach diese' how-to-display'-Variablen. – Infested

Antwort

4
  • ich nicht etwas falsch sehen, Ausgabe

  • Renderer für Artikel angewendet wird, nur in den Rest des Codes sein muss (falls sichtbar) Pop-up-Fenster,

  • Sie können die grundlegenden und einfachsten Renderer verwenden

  • Sie alle von Paramater von púaramaters außer Kraft setzen können, um - JList Liste, Objektwert, int index, boolean isSelected, boolean cellHasFocus, alle sind einstellbar, testbar ..., getrennt

.

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

Ich möchte, dass Sie wissen, wie für die angezeigt/ausgewählten Wert in einem JComboBox

die Schriftart zu ändern.

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

Danke! fontsBox.setFont (neue Schriftart (fontName, Font.PLAIN, 16)); Hat das Ding gemacht! : D – Grains

+0

Sie sind willkommen – mKorbel

+0

Das hat bei mir nicht funktioniert, es hat alles in der Dropdown-Liste überschrieben. – 2rs2ts

Verwandte Themen