Группировка объектов в Java - PullRequest
0 голосов
/ 21 марта 2020

Есть ли способ сгруппировать объекты в Java core SE?

Как у меня есть несколько JButton, JLabels и других объектов, и я хочу установить видимость их на false и включить использование функции.

Могу ли я сгруппировать эти Java объекты в единое целое, чтобы мне не приходилось писать каждый component.setVisiiblity(true) как этот.

Для дальнейшего примера у меня есть что-то вроде этого:

private void hideDashboard() {
    someButton1.setVisible(false);
    someButton2.setVisible(false);
    someButton3.setVisible(false);
    someButton4.setVisible(false);
    someLabel.setVisible(false);
}

Я не использую никаких внешних пакетов. Для IDE я использую Netbeans 8.2

Ответы [ 3 ]

1 голос
/ 21 марта 2020

Один из вариантов - сохранить их в коллекции, поскольку все они являются объектами JComponent.

Collection<JComponent> components = new ArrayList<>(Arrays.asList(button1, button2, button3, button4, button5));

components.forEach(component -> component.setVisible(false));
0 голосов
/ 24 марта 2020

И есть также несколько других опций:

  1. Если вы хотите просто сделать невидимыми некоторые компоненты, вы можете добавить их в CardLayout с панелью, содержащей все из них, и пустой.
  2. Если вы хотите применить действие к Container (например, JComponent) и ко всем его дочерним элементам Component s, то вы можете сделать рекурсивную процедуру для этого (ну, на самом деле это не обязательно, чтобы быть рекурсивным, но это, на мой взгляд, будет иметь более очевидный код).

код для первого варианта:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class Grouping1 {

    public static void main(final String[] args) {
        final JPanel buttons = new JPanel();
        for (int i = 0; i < 3; ++i)
            buttons.add(new JButton("Does nothing " + i));

        final JPanel internal = new JPanel(new BorderLayout());
        internal.add(new JTextArea("1234567890.\n0987654321."), BorderLayout.CENTER);
        internal.add(buttons, BorderLayout.LINE_END);

        final CardLayout clm = new CardLayout();
        final JPanel clp = new JPanel(clm);

        final JCheckBox enable = new JCheckBox("Click me", true);
        enable.addActionListener(e -> clm.show(clp, enable.isSelected()? "FILLED": "BLANK"));

        clp.add(internal, "FILLED");
        clp.add(new JPanel(), "BLANK");

        clm.show(clp, "FILLED");

        final JPanel contents = new JPanel(new BorderLayout());
        contents.add(clp, BorderLayout.CENTER);
        contents.add(enable, BorderLayout.PAGE_START);

        final JFrame frame = new JFrame("Components");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(contents);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

И код для второго варианта:

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.util.function.Consumer;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class Grouping2 {

    public static void applyRecursively(final Container container,
                                        final Consumer<Component> consumer) {
        for (final Component child: container.getComponents())
            if (child instanceof Container)
                applyRecursively((Container) child, consumer);
            else
                consumer.accept(child);
        consumer.accept(container);
    }

    public static void main(final String[] args) {
        final JPanel buttons = new JPanel();
        for (int i = 0; i < 3; ++i)
            buttons.add(new JButton("Does nothing " + i));

        final JPanel internal = new JPanel(new BorderLayout());
        internal.add(new JTextArea("1234567890.\n0987654321."), BorderLayout.CENTER);
        internal.add(buttons, BorderLayout.LINE_END);

        final JCheckBox enable = new JCheckBox("Click me", true);
        enable.addActionListener(e -> applyRecursively(internal, c -> c.setEnabled(enable.isSelected())));

        final JPanel contents = new JPanel(new BorderLayout());
        contents.add(internal, BorderLayout.CENTER);
        contents.add(enable, BorderLayout.PAGE_START);

        final JFrame frame = new JFrame("Components");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(contents);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

В обоих кодах просто установите флажок « Click me », чтобы переключить состояние компонентов.

Самый точный ответ хотя, по моему мнению, это может быть Джейсон, который позволяет группировать компоненты, которые вы можете выбрать. Наличие собственных Collection из Component s позволяет применять к ним действия без необходимости находиться в той же области GUI (как в моем первом коде) и без необходимости применять ко всем Container детям действие (как в моем втором коде). Я думаю, это зависит от ваших потребностей.

0 голосов
/ 21 марта 2020

Я думаю, вы можете использовать тот же подход при отображении / скрытии элементов в HTML. Вы можете обернуть их родительским элементом (например, div) и показать / скрыть их, используя CSS (например, display: none).

Как и в случае Java, если я не ошибаюсь, если вы добавите child панелей к родительской панели, и вы показываете / скрываете родительскую панель, дочерние панели также будут просто показаны / скрыты.

...