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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как бы обратиться из static метода?.. 
V
    Опции темы
GZep
Дата 26.10.2007, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Привет!

Вот есть такой код:
Код

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Programm {

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

    public Programm() {
        new Frame();
    }
}

продолжение (разделил для удобства):
Код

class Frame extends JFrame {

    public Frame () {
        super("Programm");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setJMenuBar(new MenuBar());
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }
    
    public static void updateLAF (String lAF) {
        try {
            UIManager.setLookAndFeel(lAF);
        } catch (Exception e) {
            System.out.println(e);
        }
        //следующие строчки не работают!!!
        //SwingUtilities.updateComponentTreeUI(Frame.this);
        //pack();
    }

}

и MenuBar:
Код

class MenuBar extends JMenuBar implements ActionListener {

    JMenu menu,
        UIManagerMenu;
    JMenuItem item;

    public GMenuBar () {
        add(menu = new JMenu("View"));
        menu.add(UIManagerMenu = new JMenu("Swing look & feel"));

        UIManager.LookAndFeelInfo[] lAFS = UIManager.getInstalledLookAndFeels();
        for (int i = 0; i < lAFS.length; i++) {
            UIManagerMenu.add(item = new JMenuItem(lAFS[i].getName()));
            item.setActionCommand(lAFS[i].getClassName());
            item.addActionListener(this);
        }
    }
    
    public void actionPerformed(ActionEvent actEvent) {
        Frame.updateLAF(actEvent.getActionCommand());
        //или закомментировать предыдущую строчку и рскомментировать следующие
/*
        try {
            UIManager.setLookAndFeel(lAF);
        } catch (Exception e) {
            System.out.println(e);
        }
        SwingUtilities.updateComponentTreeUI(Frame.this);
        Frame.pack();
*/
    }


actionPerformed здесь - статический.... не пойму как из него поменять laf...

Это сообщение отредактировал(а) GZep - 26.10.2007, 20:15


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
powerOn
Дата 26.10.2007, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Попробуй такой подход:

Меню:
Код

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

public class MyLookAndFeelMenu extends JMenu
{
    class MyActionListener implements ActionListener
    {
        private String lookAndFeelClassName;

        public MyActionListener(String lookAndFeelClassName)
        {
            this.lookAndFeelClassName = lookAndFeelClassName;
        }
        
        public String getLookAndFeelClassName()
        {
            return lookAndFeelClassName;
        }

        public void setLookAndFeelClassName(String lookAndFeelClassName)
        {
            this.lookAndFeelClassName = lookAndFeelClassName;
        }

        public void actionPerformed(ActionEvent e)
        {
            try
            {
                UIManager.setLookAndFeel(lookAndFeelClassName);
                SwingUtilities.updateComponentTreeUI(SwingUtilities.getWindowAncestor(MyLookAndFeelMenu.this));
            } 
            catch (Exception exception)
            {
                JOptionPane.showMessageDialog(MyLookAndFeelMenu.this, "Unable to set Look&Feel!");
                exception.printStackTrace();
            }
        }
    }

    public MyLookAndFeelMenu()
    {
        setText("Look & Feel");
        for (LookAndFeelInfo lookAndFeelInfo : UIManager.getInstalledLookAndFeels())
        {
            JMenuItem jMenuItem = new JMenuItem(lookAndFeelInfo.getName());
            this.add(jMenuItem);
            MyActionListener myActionListener = 
                    new MyActionListener(lookAndFeelInfo.getClassName());
            jMenuItem.addActionListener(myActionListener);
        }
    }
}


Фрейм для теста меню:
Код

public class NewJFrame extends javax.swing.JFrame
{
    public NewJFrame()
    {
        initComponents();
    }

    private void initComponents() 
    {
        jButton1 = new javax.swing.JButton();
        jRadioButton1 = new javax.swing.JRadioButton();
        jComboBox1 = new javax.swing.JComboBox();
        jMenuBar1 = new javax.swing.JMenuBar();
        myLookAndFeelMenu1 = new javaapplication1.MyLookAndFeelMenu();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new java.awt.FlowLayout());

        jButton1.setText("jButton1");
        getContentPane().add(jButton1);

        jRadioButton1.setText("jRadioButton1");
        getContentPane().add(jRadioButton1);

        jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        getContentPane().add(jComboBox1);

        jMenuBar1.add(myLookAndFeelMenu1);

        setJMenuBar(jMenuBar1);

        pack();
    }

    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
                {
                    public void run()
                    {
                        new NewJFrame().setVisible(true);
                    }
                });
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JComboBox jComboBox1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JRadioButton jRadioButton1;
    private javaapplication1.MyLookAndFeelMenu myLookAndFeelMenu1;
}



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

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


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



поняв этот большой код, я смог выделить нужное:
Код

        public void actionPerformed(ActionEvent e)
        {
            try
            {
                UIManager.setLookAndFeel(lookAndFeelClassName);
                SwingUtilities.updateComponentTreeUI(SwingUtilities.getWindowAncestor(MyLookAndFeelMenu.this));
            } 
            catch (Exception exception)
            {
                JOptionPane.showMessageDialog(MyLookAndFeelMenu.this, "Unable to set Look&Feel!");
                exception.printStackTrace();
            }
        }

сравним с тем, что было:
Код

    public void actionPerformed(ActionEvent actEvent) {
        try {
            UIManager.setLookAndFeel(actEvent.getActionCommand());
        } catch (Exception e) {
            System.out.println(e);
        }
        SwingUtilities.updateComponentTreeUI(Frame.this);
        Frame.pack();
    }

ИТОГО:
Код

SwingUtilities.updateComponentTreeUI(SwingUtilities.getWindowAncestor(MyLookAndFeelMenu.this));

это ключевая строчка. Как она работает? Там же this!
проблема с обращением к методу pack() (проблема - он не статический), который находится в другом классе остается открытой, тут решения не увидел.


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
powerOn
Дата 26.10.2007, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(GZep @  26.10.2007,  22:48 Найти цитируемый пост)
это ключевая строчка. Как она работает? Там же this!

Да, там this, но этот this имеет тип MyLookAndFeelMenu, поскольку данный код является кодом класса MyLookAndFeelMenu. 
конструкция [ИмяКласса.this] используется для обращения из внутренних нестатических классов и анонимных классов для обрашения к методам/полям экземпляра внешнего класса (конечно же с именем ИмяКласса). 


Цитата(GZep @  26.10.2007,  22:48 Найти цитируемый пост)
SwingUtilities.updateComponentTreeUI(SwingUtilities.getWindowAncestor(MyLookAndFeelMenu.this));

Данный кусок кода можно разбить на 2 важные части:

Код

SwingUtilities.getWindowAncestor(MyLookAndFeelMenu.this)

здесь мы получаем ссылку на Окно, в котором находится наше меню. MyLookAndFeelMenu.this - это ссылка на текущий экземпляр меню (синтаксис для анонимного класса).

Код

SwingUtilities.updateComponentTreeUI(...);


тут мы обновляем дерево компонентов.


Цитата(GZep @  26.10.2007,  22:48 Найти цитируемый пост)
проблема с обращением к методу pack() (проблема - он не статический), который находится в другом классе остается открытой, тут решения не увидел. 

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



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

PM MAIL   Вверх
GZep
Дата 26.10.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Цитата(powerOn @  26.10.2007,  22:11 Найти цитируемый пост)
Ты можешь вызвать нестатический метод только на экземпляре класса. Тебе следует поместить данный вызов в другое место, где ссылка на экземпляр окна будет доступна.

и кудаже? это должно происходить при действии, а значит в actionPerformed или в статическом методе вызываемом из actionPerformed. И то и другое не сможет этого сделать... какие варианты предусматривает java на такую ситуацию?


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
nornad
Дата 27.10.2007, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Цитата(GZep @  27.10.2007,  01:59 Найти цитируемый пост)

и кудаже? это должно происходить при действии, а значит в actionPerformed или в статическом методе вызываемом из actionPerformed. И то и другое не сможет этого сделать... какие варианты предусматривает java на такую ситуацию? 

Почему это из actionPerformed оно не сработает? Обычно его не делают статическим. Если он принадлежит экземпляру класса, то с этим классом ты можешь делать что угодно. Так же, как и с другими классами, до которых можешь дотянуться из текущего.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
GZep
Дата 27.10.2007, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



nornad, у меня actionPerformed не может вызвать метод pack, который находится в другом классе.


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
powerOn
Дата 27.10.2007, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(GZep @  27.10.2007,  19:13 Найти цитируемый пост)
nornad, у меня actionPerformed не может вызвать метод pack, который находится в другом классе. 

метод pack() - нестатический, чтобы его вызвать нужно обладать ссылкой на объект. Что бы обладать ссылкой на объект, нужно её каким-либо образом передать в метод. Как вариант, написать имплементацию ActionListener-a, которая обладает полем типа JFrame и устанавливать его значение перед регистрацией слушателя. В методе actionPerformed данное поле будет доступно, а значит и метод pack() вызвать на нем можно.



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

PM MAIL   Вверх
GZep
Дата 8.11.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Цитата(powerOn @  26.10.2007,  22:11 Найти цитируемый пост)
SwingUtilities.getWindowAncestor(MyLookAndFeelMenu.this)

здесь мы получаем ссылку на Окно, в котором находится наше меню. MyLookAndFeelMenu.this - это ссылка на текущий экземпляр меню (синтаксис для анонимного класса).

а почему эта конструкция не подходит для метода pack?
Код

SwingUtilities.getWindowAncestor(MyLookAndFeelMenu.this).pack(); //error



--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
powerOn
Дата 8.11.2007, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(GZep @  8.11.2007,  16:59 Найти цитируемый пост)
а почему эта конструкция не подходит для метода pack?

что ты имеешь ввиду?


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

PM MAIL   Вверх
GZep
Дата 8.11.2007, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



ну, почему я не могу обратиться к классу с помощью такой конструкции для вызова метода pack. Например тут:
Цитата(GZep @  26.10.2007,  21:48 Найти цитируемый пост)
SwingUtilities.updateComponentTreeUI(SwingUtilities.getWindowAncestor(MyLookAndFeelMenu.this));

как писалось раньше - работает.


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
powerOn
Дата 9.11.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Не понял ничего.  smile 

Цитата(GZep @  8.11.2007,  21:06 Найти цитируемый пост)
ну, почему я не могу обратиться к классу с помощью такой конструкции для вызова метода pack. Например тут:

К какому классу? Как обратиться? Код приведённый в цитате не наталкивает меня на какие либо мысли.

Цитата(GZep @  8.11.2007,  21:06 Найти цитируемый пост)
как писалось раньше - работает. 

Что работает?


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

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


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



Ok. Тогда максималььно подробно:
  • Есть класс MyFrame extends JFrame
  • Есть класс MyMenuBar extends JMenuBar
  • В классе MyFrame есть: setJMenuBar(new MyMenuBar());
  • В классе MyMenuBar:
Код

    public void actionPerformed(ActionEvent actEvent) {
        try {
            UIManager.setLookAndFeel(actEvent.getActionCommand());
            SwingUtilities.updateComponentTreeUI(SwingUtilities.getWindowAncestor(MyMenuBar.this));
        } catch (Exception e) {
            System.out.println(e);
        }
        //SwingUtilities.getWindowAncestor(MyMenuBar.this).pack();
    }

Вот там последняя строчка - закомментирована... так как я, кажись не попадаю к классу MyFrame для вызова pack(). Как исправить?


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
powerOn
Дата 9.11.2007, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(GZep @  9.11.2007,  20:37 Найти цитируемый пост)
так как я, кажись не попадаю к классу MyFrame для вызова pack(). 

кажись или не попадаешь? что бы проверить, переопредели у MyFrame метод pack() следующим образом:

Код

    @Override
    public void pack()
    {
        super.pack();
        System.out.println("Попал!");
    }



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

PM MAIL   Вверх
GZep
Дата 9.11.2007, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

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



powerOn, попал... просто случайная опЫчатка в коде была... smile 


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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