Как отключить почти все компоненты в JFrame? - PullRequest
1 голос
/ 25 июня 2011

Когда я начинаю некоторую обработку, я хочу отключить JButtons, JText, Lists и т. Д. В графическом интерфейсе, имея только одну кнопку для остановки обработки.

Что такое чистый способ сделать это?Я устанавливал компонент за компонентом с помощью setEnabled (false), но код был слишком велик.

Могу ли я получить все компоненты в массиве и установить все внутри цикла for?Как мне это сделать?Есть другой способ?

Ответы [ 3 ]

9 голосов
/ 25 июня 2011

Вы можете использовать подход Disabled Glass Pane .

Или использовать JOptionPane с сообщением типа «Обработка ....».Когда обработка закончена, вы закрываете диалоговое окно.Прочитайте API для примера того, как создать панель параметров, чтобы иметь доступ к реальному используемому диалогу.Вам понадобится ссылка на диалоговое окно, чтобы вы могли его закрыть.

Редактировать:

См. Как создавать диалоги для примеров.

1 голос
/ 26 июня 2011

вы можете попробовать этот класс:

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

public class Blocker extends EventQueue {
    private Component[] restrictedComponents;

    private Vector helperVector;

    private boolean inBlockedState = false;

    private EventQueue sysQ = Toolkit.getDefaultToolkit().getSystemEventQueue();

    private boolean alreadyBlockedOnce = false;

    private static Blocker instance = null;

    public static synchronized Blocker Instance() {
        if (instance == null) {
            instance = new Blocker();
        }
        return instance;
    }

    private Blocker() {
        restrictedComponents = null;
    }

    private void reset() {
        if (inBlockedState) {
            setBlockingEnabled(false);
        }
        restrictedComponents = null;
    }

    public void setRestrictedComponents(Component[] restrictedComponents) {
        reset(); // puts the Blocker into an unblocked state, and clears the
        // restrictedComponents array (see private method below)
        helperVector = new Vector();
        // global Vector variable
        if (restrictedComponents != null) {
            extractAllComponents(restrictedComponents);
        }

        // builds the blockedComponent array
        if (helperVector.size() >= 1) {
            this.restrictedComponents = new Component[helperVector.size()];
            for (int k = 0; k < helperVector.size(); k++) {
                this.restrictedComponents[k] = (Component) helperVector
                        .elementAt(k);

            }
        } else {
            this.restrictedComponents = null;
        }
    }

    private void extractAllComponents(Component[] array) {
        for (int i = 0; i < array.length; i++) {
            if (array[i] != null) {
                helperVector.addElement(array[i]);
                if (((Container) array[i]).getComponentCount() != 0) {
                    extractAllComponents(((Container) array[i]).getComponents());
                }
            }
        }
    }

    private void adjustFocusCapabilities(boolean blocked) {
        if (blocked) {
            for (int i = 0; i < restrictedComponents.length; i++) {
                this.restrictedComponents[i].setEnabled(false);
                if (restrictedComponents[i] instanceof JComponent) {
                    ((JComponent) restrictedComponents[i])
                            .setRequestFocusEnabled(false);
                    ((JComponent) restrictedComponents[i]).setEnabled(false);
                }

                // removes the focus indicator from all components that are
                // capable
                // of painting their focus
                if (restrictedComponents[i] instanceof AbstractButton) {
                    ((AbstractButton) restrictedComponents[i])
                            .setFocusPainted(false);
                    ((AbstractButton) restrictedComponents[i])
                            .setEnabled(false);
                }
            }
        } else {

            for (int k = 0; k < restrictedComponents.length; k++) {
                this.restrictedComponents[k].setEnabled(true);
                if (restrictedComponents[k] instanceof JComponent) {
                    ((JComponent) restrictedComponents[k])
                            .setRequestFocusEnabled(true);
                }
                if (restrictedComponents[k] instanceof AbstractButton) {
                    ((AbstractButton) restrictedComponents[k])
                            .setFocusPainted(true);
                }
            }
        }
    }

    private Component getSource(AWTEvent event) {
        Component source = null;
        // each of these five MouseEvents will still be valid (regardless
        // of their source), so we still want to process them.
        if ((event instanceof MouseEvent)
                && (event.getID() != MouseEvent.MOUSE_DRAGGED)
                && (event.getID() != MouseEvent.MOUSE_ENTERED)
                && (event.getID() != MouseEvent.MOUSE_EXITED)
                && (event.getID() != MouseEvent.MOUSE_MOVED)
                && (event.getID() != MouseEvent.MOUSE_RELEASED)) {
            MouseEvent mouseEvent = (MouseEvent) event;
            source = SwingUtilities.getDeepestComponentAt(mouseEvent
                    .getComponent(), mouseEvent.getX(),

            mouseEvent.getY());
        } else if (event instanceof KeyEvent
                && event.getSource() instanceof Component) {
            source = SwingUtilities.findFocusOwner((Component) (event
                    .getSource()));
        }
        return source;
    }

    private boolean isSourceBlocked(Component source) {
        boolean blocked = false;
        if ((restrictedComponents != null) && (source != null)) {
            int i = 0;
            while (i < restrictedComponents.length
                    && (restrictedComponents[i].equals(source) == false))
                i++;

            blocked = i < restrictedComponents.length;
        }
        return blocked;
    }

    protected void dispatchEvent(AWTEvent event) {
        boolean blocked = false;

        if (inBlockedState) {
            // getSource is a private helper method
            blocked = isSourceBlocked(getSource(event));
        }
        if (blocked
                && (event.getID() == MouseEvent.MOUSE_CLICKED || event.getID() == MouseEvent.MOUSE_PRESSED)) {
            Toolkit.getDefaultToolkit().beep();
        }

        else if (blocked && event instanceof KeyEvent
                && event.getSource() instanceof Component) {
            DefaultFocusManager dfm = new DefaultFocusManager();
            FocusManager.getCurrentManager();
            Component currentFocusOwner = getSource(event);

            boolean focusNotFound = true;
            do {
                dfm.focusNextComponent(currentFocusOwner);
                currentFocusOwner = SwingUtilities
                        .findFocusOwner((Component) event.getSource());
                if (currentFocusOwner instanceof JComponent) {
                    focusNotFound = (((JComponent) currentFocusOwner)
                            .isRequestFocusEnabled() == false);
                }
            } while (focusNotFound);
        } else {
            super.dispatchEvent(event);
        }
    }

    public void setBlockingEnabled(boolean block) {
        // this methods must be called from the AWT thread to avoid
        // toggling between states while events are being processed
        if (block && !inBlockedState && restrictedComponents != null) {

            adjustFocusCapabilities(true);
            // "adjustFocusCapabilities" is a private helper function that
            // sets the focusEnabled & focusPainted flags for the
            // appropriate components. Its boolean parameter signifies
            // whether we are going into a blocked or unblocked state
            // (true = blocked, false = unblocked)

            if (!alreadyBlockedOnce) {

                // here is where we replace the SystemQueue
                sysQ.push(this);
                alreadyBlockedOnce = true;
            }
            inBlockedState = true;
        } else if (!block && inBlockedState) {
            adjustFocusCapabilities(false);
            inBlockedState = false;
        }
    }
}

вы можете вызвать его с помощью ('this' относится к вашему JFrame):

Blocker.instance().setRestrictedComponents(this.getComponents());
0 голосов
/ 26 июня 2011

Еще один подход заключается в использовании JXLayer (скоро станет частью Swing as JLayer) с LockableUI .

Это решение требует дополнительной библиотеки, но оно бесконечно более гибкое и элегантное.

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