2013-05-09 6 views
5

표시/선택 값의 글꼴을 JComboBox으로 변경하는 방법을 알고 싶습니다. E.G.JComboBox의 사용자 정의 글꼴

Aharoni (this answer 이미지 제공)의 상단에 렌더링.

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

을하지만 상자가을 닫을 때이 선택한 값 에 영향을 미치지 않습니다

나는이 같은 렌더러 목록의 값을 변경할 수 있습니다. 어떤 아이디어?

+0

대신 글꼴 유형 및 크기를 조작하려면 HTML을 사용하십시오. sugegstion. – ErrorNotFoundException

+1

@Stanley * "단순한 sugegstion"* 아주 좋은 것은 아닙니다. HTML 문자열을 값으로 두는 대신 'Apple'과 같은 값을 반환하는 대신 API의 끔찍한 남용 인 ' Apple'을 얻습니다. –

+0

각 요소가 'how-to-display'변수를 보유하고 있다면 단순히 'how-to-display'변수를 변경하지 않는 것이 어떻습니까? – Infested

답변

4
    내가 뭔가 잘못 볼 수 없습니다
  • 이 문제는

  • ,

  • 렌더러가 (표시되는 경우) 팝업 창에서 항목 만 적용되는 코드의 나머지 부분에 있어야 당신 púaramaters에서 PARAMATERS에서 모든 재정의 할 수있는 기본적이고 간단한 렌더러에게

  • 을 사용할 수 있습니다 - JList의 목록, 개체 값, INT 지수, 부울에 isSelected, 부울 cellHasFocus, 모든입니다 설정 가능, 테스트 가능 ..., 분리형

.

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

편집하는 것은

그게하는 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

고마워요! fontsBox.setFont (새 글꼴 (fontName, Font.PLAIN, 16)); 그 일을 했어! : D – Grains

+0

당신은 환영합니다 – mKorbel

+0

이것은 나를 위해 작동하지 않았다, 그것은 드롭 다운 목록에있는 모든 것을 overrode. – 2rs2ts