Какое практическое правило относительно расширения компонентов Swing? - PullRequest
3 голосов
/ 27 мая 2011

При выделении класса определенному компоненту Swing, лучше extend этот конкретный компонент или создать его внутри и предоставить ссылку?

public class Foo extends JComponent{

}

OR

public class Foo{
    public JComponent getComponent(){
    }
}

EDIT

Это то, что я имею в виду под посвящением

public class Foo{
    private static Foo INSTANCE;

    public static Foo getInstance(){
        if(INSTANCE == null){
            INSTANCE = new Foo();
        }
    }

    public void createAndShowComponent(){
        //do stuff
    }
}

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

Ответы [ 6 ]

7 голосов
/ 27 мая 2011

+ 1 для композиции над расширением.Это делает API намного чище, поскольку вы показываете, какие методы важны для вашего нового компонента

3 голосов
/ 27 мая 2011

Я согласен с jzd, все зависит.

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

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

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

2 голосов
/ 27 мая 2011

Если ваш объект является компонентом, то расширяйте его.Если нет, то используйте композицию.

2 голосов
/ 27 мая 2011

Я бы сказал, что расширение было бы лучше.Возможность использовать все его свойства и использовать их как есть, делает этот объект намного проще в использовании.Просто мое личное мнение.Оба способа хороши.

Если вы посвящаете этому весь класс.С таким же успехом можно сделать это по наследству.

1 голос
/ 27 мая 2011

Я бы сказал, ни один из них. Компоненты Swing очень (очень) богаты и могут быть настроены для визуализации (L & F) и поведения (событий) любым способом. Другой момент - создать группу разных компонентов и разместить их в JPanel.

1 голос
/ 27 мая 2011

Это действительно зависит от того, что вы делаете. Если вы хотите включить свой новый класс в JPanel, например, вам нужно будет расширить компонент. Если ваш код может добавить компонент в нужное место в графическом интерфейсе, вам не нужно расширять его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...