Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JMenu vs UIManager.setLookAndFeel(), При изменении стиля не прячется меню 
V
    Опции темы
agR
Дата 25.4.2007, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.7.2006
Где: Киев

Репутация: нет
Всего: 2



Итак, возникла проблема.
В своей программке добавил возможность изменения стиля (с Metal, на Windows и т.д.).
Теперь, допустим человек нажал на пункт меню и передумал, он нажимает на любое место окна и меню прячется (стандартное поведение любого приложения). Так вот, если не изменяю стиль, то меню прячется, а если изменить  - то ни в какую... 
Подскажите, плз, как решить?
Проще всего отказаться от изменения стиля.... но вдруг когда-нить опять проблема встанет smile

PM MAIL ICQ   Вверх
powerOn
Дата 26.4.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 31
Всего: 159



Цитата(agR @  25.4.2007,  19:32 Найти цитируемый пост)
Так вот, если не изменяю стиль, то меню прячется, а если изменить  - то ни в какую... 
Подскажите, плз, как решить?


Хотелось бы на код посмотреть. Я вот накатал пример, но тут все работает:

Код

import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.metal.MetalLookAndFeel;

public class NewJFrame extends javax.swing.JFrame
{
    public NewJFrame()
    {
        initComponents();
    }
                       
    private void initComponents()
    {
        jButton4 = new javax.swing.JButton();
        jCheckBox1 = new javax.swing.JCheckBox();
        jRadioButton1 = new javax.swing.JRadioButton();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenuItem2 = new javax.swing.JMenuItem();

        getContentPane().setLayout(new java.awt.GridLayout(3, 2));

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jButton4.setText("jButton4");
        getContentPane().add(jButton4);

        jCheckBox1.setText("jCheckBox1");
        jCheckBox1.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
        jCheckBox1.setMargin(new java.awt.Insets(0, 0, 0, 0));
        getContentPane().add(jCheckBox1);

        jRadioButton1.setText("jRadioButton1");
        jRadioButton1.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
        jRadioButton1.setMargin(new java.awt.Insets(0, 0, 0, 0));
        getContentPane().add(jRadioButton1);

        jMenu1.setText("Menu");
        jMenuItem1.setText("Metal");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                jMenuItem1ActionPerformed(evt);
            }
        });

        jMenu1.add(jMenuItem1);

        jMenuItem2.setText("System");
        jMenuItem2.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                jMenuItem2ActionPerformed(evt);
            }
        });

        jMenu1.add(jMenuItem2);

        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

        pack();
    }                     
    
    private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt)                                           
    {                                               
        try
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            SwingUtilities.updateComponentTreeUI(this);
        }
        catch (InstantiationException ex)
        {
            ex.printStackTrace();
        }
        catch (IllegalAccessException ex)
        {
            ex.printStackTrace();
        }
        catch (ClassNotFoundException ex)
        {
            ex.printStackTrace();
        }
        catch (UnsupportedLookAndFeelException ex)
        {
            ex.printStackTrace();
        }
        
    }                                          
    
    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt)                                           
    {                                               
        try
        {
            UIManager.setLookAndFeel(new MetalLookAndFeel());
            SwingUtilities.updateComponentTreeUI(this);
        }
        catch (UnsupportedLookAndFeelException ex)
        {
            ex.printStackTrace();
        }
    }                                          
    
    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new NewJFrame().setVisible(true);
            }
        });
    }
                   
    private javax.swing.JButton jButton4;
    private javax.swing.JCheckBox jCheckBox1;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JRadioButton jRadioButton1;
}



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
agR
Дата 26.4.2007, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.7.2006
Где: Киев

Репутация: нет
Всего: 2



Посмотрел пример, хмммм......  действительно все работает  smile .
Вышел из положения так:
у меня меню создавалось в отдельном методе createMenuBar(), добавил его после смены стиля и все стало нормально.
Хотя как-то это по-китайски, или это тока кажется? smile. 
Цитата(powerOn @  26.4.2007,  19:03 Найти цитируемый пост)
Хотелось бы на код посмотреть.

Код

class PlafSelect {
        public JMenuItem makeMenu(String name, final String plafName) {
            final JMenuItem menuItem = new JMenuItem(name);
            menuItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    try {
                        UIManager.setLookAndFeel(plafName);
                        SwingUtilities.updateComponentTreeUI(menuItem);
                        createMenuBar(); // теперь работает нормально
                    }
                    catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            });
            return menuItem;
        }
    }


PM MAIL ICQ   Вверх
powerOn
Дата 26.4.2007, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 31
Всего: 159



Цитата(agR @  26.4.2007,  21:25 Найти цитируемый пост)
у меня меню создавалось в отдельном методе createMenuBar(), добавил его после смены стиля и все стало нормально.

А есть ли смысл меню каждый раз заново содавать? (или createMenuBar();  нечто иное делает?). Как показывает теория и практика достаточно вызвать SwingUtilities.updateComponentTreeUI(); для всех контеров верхнего уровня (т.е. для окон).


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
agR
Дата 26.4.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.7.2006
Где: Киев

Репутация: нет
Всего: 2



Цитата(powerOn @  26.4.2007,  20:39 Найти цитируемый пост)
А есть ли смысл меню каждый раз заново содавать? (или createMenuBar();  нечто иное делает?). Как показывает теория и практика достаточно вызвать SwingUtilities.updateComponentTreeUI(); для всех контеров верхнего уровня (т.е. для окон). 

Точно, не тот компонент в updateComponentTreeUI() передал.
Спасибо  smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.