【问题标题】:Swing - Change menu bar and menu items font size in runtimeSwing - 在运行时更改菜单栏和菜单项的字体大小
【发布时间】:2016-12-29 00:52:04
【问题描述】:

正如标题所说,我需要使用 SWING 更改菜单栏及其上的每个项目(以及项目的项目)的字体大小。

我有以下代码在运行时有效,但在单击菜单项时需要它

Font f = new Font("sans-serif", Font.PLAIN, 12);
UIManager.put("Menu.font", f);
UIManager.put("MenuItem.font", f);

我的菜单代码是

private class foo{
        private JMenu mnArchivo;
        private JMenuBar menuBar;
        menuBar = new JMenuBar();
        frmAdministracinHospital.setJMenuBar(menuBar);

    JRadioButtonMenuItem rdbtnmntmGrande = new JRadioButtonMenuItem("Grande");
            rdbtnmntmGrande.addActionListener(new MiGrandeActionListener());
            rdbtnmntmGrande.setIcon(new ImageIcon(PrincipalWindow.class.getResource("/presentacion/fontbig.png")));
            buttonGroup.add(rdbtnmntmGrande);
            mnTamanoFuente.add(rdbtnmntmGrande);

    private class MiGrandeActionListener implements ActionListener {
            public void actionPerformed(ActionEvent e) {

                Font f = new Font(menuBar.getFont().getFontName(), menuBar.getFont().getStyle(), 12);
                UIManager.put("Menu.font", f);
            }
        }

我还没有发现任何类似的问题可以在运行时完成,我怎么能做到这一点?

编辑。代码添加不工作字体大小更改不止一次。

package presentacion;

import java.awt.EventQueue;
import java.awt.Font;
import java.awt.SystemColor;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import dominio.Appointment;
import dominio.Patient;
import dominio.Specialist;


public class pepe {

    private JFrame a;
    private JTabbedPane tabbedPane;
    private JMenuBar menuBar;
    private final ButtonGroup buttonGroup = new ButtonGroup();


    public pepe() {
        initialize();
        a.setVisible(true);
    }

    public static void main(String[] args) {

        try {
            // Set System L&F
        UIManager.setLookAndFeel(
            UIManager.getSystemLookAndFeelClassName());
    } 
    catch (UnsupportedLookAndFeelException e) {
       // handle exception
    }
    catch (ClassNotFoundException e) {
       // handle exception
    }
    catch (InstantiationException e) {
       // handle exception
    }
    catch (IllegalAccessException e) {
       // handle exception
    }

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    pepe window = new pepe();
                    window.a.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private void initialize() {
        a = new JFrame();
        a.setTitle("Administraci\u00F3n Hospital");
        a.setBounds(100, 100, 1195, 710);
        a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        tabbedPane = new JTabbedPane(JTabbedPane.TOP);
        tabbedPane.setBackground(SystemColor.info);

        menuBar = new JMenuBar();
        a.setJMenuBar(menuBar);

        JMenu mnVer = new JMenu("Ver");
        menuBar.add(mnVer);

        JMenu mnTamanoFuente = new JMenu("Tama\u00F1o fuente");
        mnVer.add(mnTamanoFuente);

        JRadioButtonMenuItem rdbtnmntmPequeo = new JRadioButtonMenuItem("Peque\u00F1o");
        rdbtnmntmPequeo.addActionListener(new MiPequenaActionListener());
        buttonGroup.add(rdbtnmntmPequeo);
        mnTamanoFuente.add(rdbtnmntmPequeo);

        JRadioButtonMenuItem rdbtnmntmGrande = new JRadioButtonMenuItem("Grande");
        rdbtnmntmGrande.addActionListener(new MiGrandeActionListener());
        buttonGroup.add(rdbtnmntmGrande);
        mnTamanoFuente.add(rdbtnmntmGrande);

    }

    private class MiPequenaActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            Font f = new Font(a.getFont().getFontName(), a.getFont().getStyle(), 10);
            UIManager.put("Label.font", f);
            UIManager.put("Menu.font", f);
            UIManager.put("MenuItem.font", f);
            SwingUtilities.updateComponentTreeUI(a);

        }
    }

    private class MiGrandeActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            Font f = new Font(a.getFont().getFontName(), a.getFont().getStyle(), 13);
            UIManager.put("Label.font", f);
            UIManager.put("Menu.font", f);
            UIManager.put("MenuItem.font", f);
            SwingUtilities.updateComponentTreeUI(a);
        }
    }

}

有了它,我只需将字体大小更改一次,例如(大),如果我点击小或正常,它不会做任何事情。

谢谢。

【问题讨论】:

    标签: java swing


    【解决方案1】:

    我有以下代码,但在运行时不起作用,

    Font f = new Font(menuBar.getFont().getFontName(), menuBar.getFont().getStyle(), 12);
    UIManager.put("Menu.font", f);
    

    基本上你需要做一个LAF改变,所以上面应该是:

    Font f = new FontUIResource(menuBar.getFont().getFontName(), menuBar.getFont().getStyle(), 12);
    UIManager.put("Menu.font", f);
    SwingUtilities.updateComponentTreeUI(frame);
    

    您需要确保 Font 是 FontUIResource,以便 LAF 可以更改属性。

    阅读 Changing the LAF After Startup 上的 Swing 教程部分,了解更多信息和示例。

    【讨论】:

    • 成功了!谢谢!如果您知道,还有一个问题,是否也可以同时更新所有 JLabel ?因为我知道一种方法(没有 UIManager),但我必须一个一个地做,这很痛苦。
    • is it possible to update all JLabel at the same - 为什么这种方法不起作用?如果您有问题,请发布您的minimal reproducible example
    • 这里我们使用“Menu”和“MenuItem”,我的意思是,我必须使用什么标签?
    • @UlisesCT, in this we're using "Menu" and "MenuItem", - 我猜你猜?
    • if I set it to big for example, then it wont work if I try to set it small or normal size. - 对我来说很好(在其他组件上,我没有尝试过 JMenu 或 JMenuItem)。正如我在之前的评论中所说,发布您的minimal reproducible example 来证明问题。顺便说一句,您可以查看UIManager Defaults 了解其他 UI 属性。
    猜你喜欢
    • 1970-01-01
    • 2014-07-13
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    相关资源
    最近更新 更多