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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Условно-рекурсивный метод, вызывается метод JDK с терминальной ветк 
V
    Опции темы
Platon
Дата 1.11.2008, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 4
Всего: 40



Здравствуйте, уважаемые.

Я написал работающий код, который мне, в принципе нравится. Но, возможно, есть подвох.

Код

hardUploadButton.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                showLoadPanel(hardUploadButton.isSelected());
            }
        });
//...
easyUploadButton.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                showLoadPanel(easyUploadButton.isSelected());
            }
        });

private void showLoadPanel(boolean show) {
        easyUploadButton.setSelected(show);
        hardUploadButton.setSelected(show);
        if (show)
            easyUploadButton.setText("Спрятать");
        else
            easyUploadButton.setText("Открыть");
        if (show)
            hardUploadButton.setText("Спрятать");
        else
            hardUploadButton.setText("Открыть");
        easyUploadPanel.setVisible(show);
        hardUploadPanel.setVisible(show);
    }


В этом коде обратите внимание на 2 строчки.
Код

easyUploadButton.setSelected(show);
hardUploadButton.setSelected(show);

Фактически, я надеюсь на то, что в этих кнопках при установке одного и того же значения никакие ChangeListener'ы больше вызваны не будут.
Могу ли я на 100% положиться на компоненты Swing, или стоит обезопасить себя?
PM MAIL ICQ   Вверх
dorogoyIV
Дата 1.11.2008, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 36
Всего: 46



я возможно не совсем понял:
если
Код

if(show)
 setSelected(show)
else
 setSelected(show)

в методе "иф" show = true
в методе "елсе" show = false

лучше так:
Код

 show = !show;



Цитата(Platon @  1.11.2008,  15:03 Найти цитируемый пост)
Могу ли я на 100% положиться на компоненты Swing, или стоит обезопасить себя?

можно,
JComponent не меняет ссылку false/true на противоположную (третий вариант булевой переменной здесь не рассматриваем  smile )

Это сообщение отредактировал(а) dorogoyIV - 1.11.2008, 22:47
PM MAIL   Вверх
Keyo
Дата 1.11.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

        if (show)
            easyUploadButton.setText("Спрятать");
        else
            easyUploadButton.setText("Открыть");
        if (show)
            hardUploadButton.setText("Спрятать");
        else
            hardUploadButton.setText("Открыть");

Не лучше ли
Код

        if (show) {
            easyUploadButton.setText("Спрятать");
            hardUploadButton.setText("Спрятать");
        } else {
            easyUploadButton.setText("Открыть");
            hardUploadButton.setText("Открыть");
       }


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


Autonomous R&D
**


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

Репутация: 4
Всего: 81



Keyo, ну тогда уж лучше
Код

        String s = show ? "Спрятать" : "Открыть";
        easyUploadButton.setText(s);
        hardUploadButton.setText(s);

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


Шустрый
*


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

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



ivg, ну тогда уж, плюс к этому, лучше строки вынести в поля класса, как статик файнал, зачем плодить объекты  smile или вообще resource bundle
PM MAIL   Вверх
dorogoyIV
Дата 1.11.2008, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 36
Всего: 46



Keyo
ivg,  smile  , хорошь прикалываться  smile   smile 
PM MAIL   Вверх
Platon
Дата 2.11.2008, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 4
Всего: 40



dorogoyIV, уважаемый, я что-то вообще ничего не понял...
Я не про противоположность имею ввиду.

Распишу подробней. К примеру 
0. у нас состояние двух кнопок false.
1. теперь на easyUpload ткнули, при переходе к методу showLoadPanel передается флажек true
2. в методе showLoadPanel вызывается опять же easyUpload.setSelected(show), который будет терминальной веткой, и выходит из метода easyUpload.setSelected(show)
3. в методе showLoadPanel вызывается hardUpload.setSelected(show), который обязательно вызовет все свои ChangeListener'ы, в том числе и мой привязанный, который вызывает опять же showLoadPanel с флажком true.
4. опять входим в showLoadPanel там обе строчки - терминальные ветки.
5. устанавливаем наш до невозможности оптимизированный код (за него отдельное спасибо), выходим
6. устанавливаем наш до невозможности оптимизированный код (за него отдельное спасибо), выходим

Единственный маленький недочет - вызываем часть кода дважды (пункты 5,6).
PM MAIL ICQ   Вверх
dorogoyIV
Дата 2.11.2008, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 36
Всего: 46



Platon, сдается мне - вы сами запутались в своих методах
к чему все эти сложности?
у булевой переменной всего два значения - true/false , отсюда делаем выводы...

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

Это сообщение отредактировал(а) dorogoyIV - 2.11.2008, 09:08
PM MAIL   Вверх
Platon
Дата 2.11.2008, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 4
Всего: 40



dorogoyIV, showLoadPanel - своего рода Mediator, можно не только кликнуть по одной из двух кнопок, но и напрямую вызывать этот метод с установкой соответствующего флажка. Через минуту приведу код.

Добавлено через 14 минут и 55 секунд
Код

import javax.swing.*;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.*;

public class Test {

    private JButton selectButton;
    private JButton unselectButton;

    private JToggleButton easyUploadButton;
    private JToggleButton hardUploadButton;
    private JPanel panel;


    public Test() {
        selectButton = new JButton("выделить");
        unselectButton = new JButton("убрать выделение");

        easyUploadButton = new JToggleButton();
        hardUploadButton = new JToggleButton();

        selectButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                selectButtons(true);
            }
        });

        unselectButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                selectButtons(false);
            }
        });

        ChangeListener changeListener = new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                JToggleButton tb = (JToggleButton)e.getSource();
                selectButtons(tb.isSelected());
            }
        };
        easyUploadButton.addChangeListener(changeListener);
        hardUploadButton.addChangeListener(changeListener);

        panel = new JPanel();
        panel.add(easyUploadButton);
        panel.add(hardUploadButton);
        panel.add(selectButton);
        panel.add(unselectButton);
        selectButtons(false);
    }

    public void selectButtons(boolean select) {
        easyUploadButton.setSelected(select);
        hardUploadButton.setSelected(select);
        String s = select ? "Выделено" : "Скрыто";
        easyUploadButton.setText(s);
        hardUploadButton.setText(s);
        // и еще чего-нибудь
    }

    public Component getView() {
        return panel;
    }

    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.getContentPane().add(new Test().getView());
        f.setSize(new Dimension(500, 100));
        f.setLocationByPlatform(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}


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


Эксперт
***


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

Репутация: 36
Всего: 46



Цитата(Platon @  2.11.2008,  10:56 Найти цитируемый пост)
Через минуту приведу код.

 smile  вы нивкакую не хотите привести код  smile 

Цитата(Platon @  2.11.2008,  10:56 Найти цитируемый пост)
 можно не только кликнуть по одной из двух кнопок, но и напрямую вызывать этот метод с установкой соответствующего флажка.

можно ведь отменить ActionListener
Код

removeActionListener(...


кажется у вас логика построена по индусски... (это предположение - не вижу кода - не знаю)

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


Эксперт
***


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

Репутация: 4
Всего: 40



Цитата(dorogoyIV @  2.11.2008,  15:29 Найти цитируемый пост)
можно ведь отменить ActionListener

не по-индусски ли это?

Код есть ;) обновите тему.

На самом деле тут можно выделить полноценный класс SwitchMediator и сделать:

Код

class SwitchMediator {
    private JToggleButton b1, b2;
    // сеттеры кнопочек.

    private boolean selectedState;

    public void doSwitch(boolean state) {
        if (selectedState == state) return;
        selectedState = state;
        b1.setSelected(state);
        b2.setSelected(state);
        String s = select ? "Выделено" : "Скрыто";
        b1.setText(s);
        b2.setText(s);
    }
}

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


Эксперт
***


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

Репутация: 36
Всего: 46



Platon, на самом деле я вам доверяю, (шахматы!!!) , но кажется в этом месте вы затупили!!! или я туплю  smile 
PM MAIL   Вверх
Platon
Дата 2.11.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 4
Всего: 40



Да, в нашей беседе явно не хватает третьего адекватного лица.

Добавлено через 5 минут и 33 секунды
Цитата(dorogoyIV @  2.11.2008,  16:03 Найти цитируемый пост)
но кажется в этом месте вы затупили

не то что бы затупил, но подход поддозрительный, поэтому выставил вопрос на публику.
PM MAIL ICQ   Вверх
dorogoyIV
Дата 3.11.2008, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 36
Всего: 46



Цитата(Platon @  2.11.2008,  16:00 Найти цитируемый пост)
но подход поддозрительный

я делаю так:  smile 


Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  StopWatch.jar 5,85 Kb
PM MAIL   Вверх
Platon
Дата 3.11.2008, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 4
Всего: 40



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

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

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


 




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


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

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