Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Условно-рекурсивный метод


Автор: Platon 1.11.2008, 15:03
Здравствуйте, уважаемые.

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

Код

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, или стоит обезопасить себя?

Автор: dorogoyIV 1.11.2008, 20:30
я возможно не совсем понял:
если
Код

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 )

Автор: Keyo 1.11.2008, 21:58
Код

        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 

Автор: ivg 1.11.2008, 22:51
Keyo, ну тогда уж лучше
Код

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

Автор: Keyo 1.11.2008, 23:06
ivg, ну тогда уж, плюс к этому, лучше строки вынести в поля класса, как статик файнал, зачем плодить объекты  smile или вообще resource bundle

Автор: dorogoyIV 1.11.2008, 23:20
Keyo, 
ivg,  smile  , хорошь прикалываться  smile   smile 

Автор: Platon 2.11.2008, 08:22
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).

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

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

Автор: Platon 2.11.2008, 10:56
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);
    }
}


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

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

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

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

removeActionListener(...


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

Автор: Platon 2.11.2008, 14:48
Цитата(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);
    }
}

Автор: dorogoyIV 2.11.2008, 15:03
Platon, на самом деле я вам доверяю, (шахматы!!!) , но кажется в этом месте вы затупили!!! или я туплю  smile 

Автор: Platon 2.11.2008, 16:00
Да, в нашей беседе явно не хватает третьего адекватного лица.

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

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

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

я делаю так:  smile 

Автор: Platon 3.11.2008, 08:45
Пожалуй, вы правы.  smile  пересмотрю своё мировоззрение.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)