首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在可见JMenu和JMenu字体之后更新JMenuBar和JMenuBar字体

在可见JMenu和JMenu字体之后更新JMenuBar和JMenuBar字体
EN

Stack Overflow用户
提问于 2016-07-14 20:27:13
回答 3查看 1.5K关注 0票数 2

下面的代码创建了一个简单的图形用户界面,中心有一个按钮,点击后应该更新JMenuBar组件的字体。为此,setMyFontActionListener中触发JButton上的一个方法。然而,经过几次尝试后,我没有做到这一点,但我不知道为什么。setMyFont中使用的代码如下

代码语言:javascript
运行
复制
public void setMyFont(Font f, Font f2) {
    //Attempt 1 in the hope it would autodetect that font
    //had changed and just update
    menuFont = f;
    menuItemFont = f2;

    //Attempt 2 in the hope on the repaint it would update 
    //the font with the new UIManager properties
    UIManager.put("Menu.font", menuFont);
    UIManager.put("MenuItem.font", menuItemFont);

    //Attempt 3 in the hope that going over each component 
    //individually would update the font
    for(Component comp: getComponents()) {
        if(comp instanceof JMenu) {
            comp.setFont(menuFont);
        } else {
            comp.setFont(menuItemFont);
        }
    }

    validate();
    repaint();
}

字体没有用当前代码更新组件的原因吗?此外,即使已经创建了组件,我如何才能更改代码以允许在组件上更新字体呢?

的完整代码

代码语言:javascript
运行
复制
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.UIManager;

public class Main extends JFrame {
    private static final long serialVersionUID = 3206847208968227199L;
    JButton but;
    MenuBar mB;

    private Main() {
        setSize(600, 600);

        mB = new MenuBar();
        setJMenuBar(new MenuBar());

        but = new JButton("Change Font");
        but.addActionListener(new CustomActionListener());
        add(but);

        setVisible(true);
        setLocationRelativeTo(null);
    }

    public static void main(String[] args) {
        new Main();
    }

    private class MenuBar extends JMenuBar {
        private static final long serialVersionUID = -2055260049565317972L;
        Font menuFont = new Font("Courier", Font.ITALIC + Font.BOLD, 12);
        Font menuItemFont = new Font("sans-serif", 0, 12);
        JMenu menu, subMenu;

        MenuBar() {
            UIManager.put("Menu.font", menuFont);
            UIManager.put("MenuItem.font", menuItemFont);

            menu = new JMenu("Menu");

            subMenu = new JMenu("Sub Menu");
            subMenu.add(new JMenuItem("Sub Item"));
            subMenu.add(new JMenu("Sub Menu"));
            menu.add(subMenu);

            menu.add(new JMenuItem("Sub Item"));
            menu.add(new JMenu("Sub Menu"));

            add(menu);

            menu = new JMenu("Another Menu");
            menu.add(new JMenu("Sub Menu"));
            menu.add(new JMenuItem("Sub Item"));
            menu.add(new JMenu("Sub Menu"));
            add(menu);
        }

        public void setMyFont(Font f, Font f2) {
            //Attempt 1 in the hope it would autodetect that font
            //had changed and just update
            menuFont = f;
            menuItemFont = f2;

            //Attempt 2 in the hope on the repaint it would update 
            //the font with the new UIManager properties
            UIManager.put("Menu.font", menuFont);
            UIManager.put("MenuItem.font", menuItemFont);

            //Attempt 3 in the hope that going over each component 
            //individually would update the font
            for(Component comp: getComponents()) {
                if(comp instanceof JMenu) {
                    comp.setFont(menuFont);
                } else {
                    comp.setFont(menuItemFont);
                }
            }

            validate();
            repaint();
        }
    }

    private class CustomActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            mB.setMyFont(new Font("sans-serif", 0, 12), new Font("Courier", Font.ITALIC + Font.BOLD, 12));
        }
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-14 20:46:55

  1. 设置字体后,您需要让层次结构中的每个组件更新它的UI - SwingUtilities有一个方便的方法 UIManager.put("Menu.font",menuFont);SwingUtilities.updateComponentTreeUI( Main.this );
  2. 使用FontUIResource类例如 FontUIResource menuFont =新FontUIResource(“信使”,Font.ITALIC + Font.BOLD,12);

以下代码来自已发布的SSCCE,适用于我:

代码语言:javascript
运行
复制
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;

public class Main extends JFrame {
    private static final long serialVersionUID = 3206847208968227199L;
    JButton but;
    MenuBar mB;

    private Main() {
        setSize(600, 600);

        mB = new MenuBar();
        setJMenuBar(mB);

        but = new JButton("Change Font");
        but.addActionListener(new CustomActionListener());
        add(but);

        setVisible(true);
        setLocationRelativeTo(null);
    }

    public static void main(String[] args) {
        new Main();
    }

    private class MenuBar extends JMenuBar {
        private static final long serialVersionUID = -2055260049565317972L;
        Font menuFont = new FontUIResource("Courier", Font.ITALIC + Font.BOLD, 12);
        Font menuItemFont = new FontUIResource("sans-serif", 0, 12);
        JMenu menu, subMenu;

        MenuBar() {
            UIManager.put("Menu.font", menuFont);
            UIManager.put("MenuItem.font", menuItemFont);

            menu = new JMenu("Menu");

            subMenu = new JMenu("Sub Menu");
            subMenu.add(new JMenuItem("Sub Item"));
            subMenu.add(new JMenu("Sub Menu"));
            menu.add(subMenu);

            menu.add(new JMenuItem("Sub Item"));
            menu.add(new JMenu("Sub Menu"));

            add(menu);

            menu = new JMenu("Another Menu");
            menu.add(new JMenu("Sub Menu"));
            menu.add(new JMenuItem("Sub Item"));
            menu.add(new JMenu("Sub Menu"));
            add(menu);
        }

        public void setMyFont(Font f, Font f2) {

            menuFont = f;
            menuItemFont = f2;
            UIManager.put("Menu.font", menuFont);
            UIManager.put("MenuItem.font", menuItemFont);
            SwingUtilities.updateComponentTreeUI(Main.this);
        }
    }

    private class CustomActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            mB.setMyFont(new FontUIResource("sans-serif", 0, 12), new FontUIResource("Courier", Font.ITALIC + Font.BOLD, 12));
        }
    }
}
票数 4
EN

Stack Overflow用户

发布于 2016-07-14 20:56:32

代码语言:javascript
运行
复制
    mB = new MenuBar();
    setJMenuBar(new MenuBar());

您的ActionListener没有处理添加到框架中的菜单。

守则应是:

代码语言:javascript
运行
复制
    mB = new MenuBar();
    //setJMenuBar(new MenuBar());
    setJMenuBar(mB);

getComponents()方法不是递归的。因此,您的循环只会将JMenu组件添加到JMenuBar,而不是JMenuItems。

此外,在创建字体时,为什么不使用更大的字体大小,这样您就可以实际看到是否有什么变化。

此外,在发布的代码中,在创建组件之前设置UIManager字体属性会使按钮的功能落空。您的菜单将已经是所需的字体。

票数 3
EN

Stack Overflow用户

发布于 2017-05-19 17:19:20

也许你可以试试这个:

代码语言:javascript
运行
复制
    public class MenuFontChange {

    public static void changeMenuFont(JMenuBar jBar, Font font) {
        Component[] components = jBar.getComponents();
        for (Component component : components) {
            component.setFont(font);
            changeMenuItemFont((JMenu) component, font);
        }
    }

    public static void changeMenuItemFont(JMenu jMenu, Font font) {
        int n = jMenu.getItemCount();
        for (int i = 0; i < n; i++) {
            JMenuItem item = jMenu.getItem(i);
            item.setFont(font);
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38383694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档