Изменить шрифт строки меню и пунктов меню

Я пытаюсь сделать элементы строки меню и элементы элементов больше и меньше, я искал здесь немного раньше (поэтому не отмечайте это как повторение, пожалуйста), и ни один из сообщений, которые я нашел, не работает .

Я безуспешно пробовал следующие коды:

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

И

menuBar.setFont(new Font(menuBar.getFont().getFontName(), menuBar.getFont().getStyle(), 12));

И это мой код, в котором я пытаюсь редактировать шрифт:

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

Любая подсказка, пожалуйста?


person Ulises CT    schedule 27.12.2016    source источник
comment
В каком месте кода вы меняете шрифт? Это выполняется на EDT? Когда вы говорите, что это не работает, вы имеете в виду, что внешний вид предметов не меняется вообще или не так, как ожидалось?   -  person Calculator    schedule 27.12.2016
comment
я добавил немного кода @Calculator   -  person Ulises CT    schedule 27.12.2016
comment
Вероятно, бессмысленный вопрос: вы пробовали это с другими размерами шрифта? 12 по умолчанию.   -  person Calculator    schedule 27.12.2016
comment
да, и по умолчанию 11, я думаю, по крайней мере, для JLabel   -  person Ulises CT    schedule 27.12.2016


Ответы (2)


Это потому, что в UIManager"menuBar.font". > класс, он должен быть:

UIManager.put("MenuBar.font", f);

то есть заглавные буквы важны или:

UIManager.put("MenuItem.font", f);

для каждого шрифта JMenuItem

Вот список этих свойств.

Также связано: Изменение шрифта JMenuBar


РЕДАКТИРОВАТЬ: добавлен mcve

Я не вижу, где он не работает, если я запускаю этот код, у меня он работает нормально

import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class UIManagerFontChangeExample {
    
    private JFrame frame;
    private JLabel label;
    private JMenuItem item1, item2;
    private JMenu menu;
    private JMenuBar bar;
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Font f = new Font("sans-serif", Font.PLAIN, 12);
                UIManager.put("Menu.font", f);
                UIManager.put("MenuItem.font", f);
                UIManagerFontChangeExample example = new UIManagerFontChangeExample();
                example.createAndShowGui();
            }
        });
    }
    
    public void createAndShowGui() {
        frame = new JFrame("Font changing example");
        label = new JLabel("This is a label");
        bar = new JMenuBar();
        menu = new JMenu("Menu");
        item1 = new JMenuItem("Item1");
        item2 = new JMenuItem("Item2");
        
        menu.add(item1);
        menu.add(item2);
        bar.add(menu);
        
        frame.add(label);
        frame.setJMenuBar(bar);
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

Перед сменой шрифта:

введите здесь описание изображения

После смены шрифта:

введите здесь описание изображения

Код, который я добавил выше, называется: Минимальный, полный и проверяемый пример, в следующий раз, пожалуйста, опубликуйте действительный, то же самое, что и я. , чтобы мы могли копировать и вставлять, я не использовал actionListener, потому что вопрос связан не с действиями, а со шрифтом. Или Icon, потому что это тоже не связано, я сделал полный пример кода, который вы можете скопировать-вставить и посмотреть, как он работает, ничего не изменяя, это то, о чем вас просили.

Для шрифта MenuBar вам нужно позвонить:

UIManager.put("Menu.font", f);

И для MenuItem

UIManager.put("MenuItem.font", f);
person Frakcool    schedule 27.12.2016
comment
все еще не работает, разве это не должно быть имя моего компонента строки меню, который называется menuBar? - person Ulises CT; 27.12.2016
comment
Это не имя вашего компонента, это имя свойства. Это изменит все ваши JMenuBar, я предлагаю вам проверить с помощью MenuItem и использовать более крупный шрифт, чтобы проверить его, если он все еще не работает, укажите действительный минимально воспроизводимый пример - person Frakcool; 27.12.2016
comment
все то же самое:/, не знаю, должно ли это работать и с JLabel, но я тоже пробовал, и тоже не работает. Единственный код, который у меня есть, это объявление компонентов и слушателя, мне все еще добавить его? - person Ulises CT; 27.12.2016
comment
Пожалуйста, прочитайте, что такое минимально воспроизводимый пример, то есть небольшая программа, которая имеет 1 JMenu, с 1 или 2 JMenuItems и JLabel вероятно, где вы показываете, как вы меняете шрифт - person Frakcool; 27.12.2016
comment
но что я действительно хочу изменить, так это размер шрифта - person Ulises CT; 27.12.2016
comment
ладно я только что понял что не так, если я поставил этот код с самого начала он работает, но я хочу изменить размер при нажатии опции из пункта меню и есть когда он не работает, если я его поставлю в своем слушателе @Frakcool - person Ulises CT; 28.12.2016
comment
@UlisesCT в этом вопросе никогда не говорилось, что он должен быть во время выполнения, этот вопрос уже решен, задайте новый вопрос, включая минимальный воспроизводимый пример и принять ответ. Но, пожалуйста, сначала найдите похожие вопросы, потому что на них уже были даны ответы - person Frakcool; 28.12.2016
comment
Не уверен, что вы уже решили эту проблему, но если вы хотите внести изменения в свойства диспетчера пользовательского интерфейса на лету, вам нужно будет использовать метод SwingUtilities.updateComponentTreeUI(Component) и передать компонент самого высокого уровня, обычно Window или Фрейм, в котором содержится ваш компонент. - person jdb1015; 14.07.2017
comment
@ jdb1015 вопрос, на который вы ссылаетесь, уже решен, это был вопрос того же пользователя - person Frakcool; 14.07.2017

Если вы обновляете свойства Диспетчера пользовательского интерфейса на лету (например, после появления вашего графического интерфейса), вам нужно будет сделать вызов SwingUtilities.updateComponentTreeUI(Component) после установки свойства Диспетчера пользовательского интерфейса. Вы захотите передать компонент самого высокого уровня, который хотите обновить (в данном случае, вероятно, ваш верхний уровень Window или JFrame).

person jdb1015    schedule 13.07.2017