2013-05-09 17 views
5

Chciałbym wiedzieć, jak zmienić czcionkę wyświetlanej/wybranej wartości w JComboBox. NA PRZYKŁAD.Niestandardowa czcionka dla JComboBox

górna trójwymiarowa Aharoni (obraz uprzejmości this answer).

mogę zmienić wartości list z renderujący tak:

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

Ale to nie wpływa na wybraną wartość gdy okno jest zamknięte. Jakieś pomysły?

+0

Zamiast tego użyj HTML, aby zmienić typ i rozmiar czcionki. Tylko sugestia. – ErrorNotFoundException

+1

@Stanley * "Tylko sugestia" * Niezbyt dobra. Umieszczając ciągi HTML jako wartości, zamiast odzyskać wartości takie jak "Apple", otrzymujemy ' Apple' - okropne nadużycie API. –

+0

jeśli każdy element posiada zmienne "jak wyświetlić", dlaczego nie po prostu zmienić te zmienne "jak wyświetlić?" – Infested

Odpowiedz

4
  • Nie widzę coś złego, problem musi być w pozostałej części kodu

  • Renderer jest stosowana tylko dla pozycji w (jeśli jest widoczny) okienko,

  • ty można używać podstawowych i najprostszych renderer

  • można zastąpić wszystko od paramaters z púaramaters - listy JList, wartość obiektu, int index, boolean isSelected, boolean cellHasFocus, każdy jest konfigurowalny, testowalny ..., oddzielny

.

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

chciałbym że aby wiedzieć, jak zmienić czcionkę dla wyświetlanej/wybranej wartości w 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

Dzięki! fontsBox.setFont (nowa czcionka (fontName, Font.PLAIN, 16)); Zrobiłem to! : D – Grains

+0

serdecznie zapraszamy – mKorbel

+0

To nie zadziałało, przeważyło wszystko z listy rozwijanej. – 2rs2ts

Powiązane problemy