【问题标题】:Custom Font for JComboBoxJComboBox 的自定义字体
【发布时间】:2013-05-03 21:50:23
【问题描述】:

我想知道如何更改 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;
    }
}

但这不会影响框关闭时的选定值。有什么想法吗?

【问题讨论】:

  • 改用 Html 来操作字体类型和大小..只是一个建议。
  • @Stanley “只是一个建议” 不是一个很好的建议。通过将 HTML 字符串作为值,而不是返回像 Apple 这样的值,我们得到 <html><body><font ..>Apple - API 的可怕滥用。
  • 如果每个元素都包含一个“如何显示”变量,那么为什么不简单地更改那些“如何显示”变量呢?
  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 我在问题中添加了一个屏幕截图,我认为它“一目了然”。 Take it out 如果您不同意(可能在您添加 SSCCE 时)。 ;)

标签: java swing fonts jcombobox


【解决方案1】:
  • 我看不出有什么问题,问题一定出在您的代码的其余部分

  • 渲染器仅适用于弹出窗口(如果可见)中的项目,

  • 你可以使用基本最简单的渲染器

  • 您可以覆盖所有来自 púaramaters 的参数 - JList 列表、对象值、 int index, boolean isSelected, boolean cellHasFocus, each are settable, testable ..., 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;
    }
}

编辑

我想知道如何更改字体 JComboBox 中显示/选择的值

.

.

.

.

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

【讨论】:

  • 谢谢! fontsBox.setFont(new Font(fontName, Font.PLAIN, 16));干了这件事! :D
  • 这对我不起作用,它覆盖了下拉列表中的所有内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2015-01-27
  • 1970-01-01
相关资源
最近更新 更多