как сделать JDialog неактивным - PullRequest
5 голосов
/ 23 февраля 2012

Я хочу сделать неактивное окно на основе JDialog, чтобы все элементы управления были отключены (серым цветом).setEnabled (false) просто делает невозможным щелкнуть любой элемент управления, даже закрыть окно.Но ничего не становится серым.Помогите, пожалуйста.

РЕДАКТИРОВАТЬ : Вот пример кода.

import javax.swing.JButton;
import javax.swing.JDialog;


public class Analyzer extends JDialog{

public Analyzer() {
    JButton but = new JButton("test");
    setLayout(null);
    but.setBounds(10,10,100,100);

    add(but);
    setSize( 200, 200);
    setVisible(true);
    setEnabled(false);
}

public static void main(String[] args) {
    new Analyzer();
}

}

Ответы [ 2 ]

8 голосов
/ 23 февраля 2012

Два способа, которые я знаю, чтобы сделать это, один, где вы рекурсивно отключаете компоненты диалога, и второй, где вы отключаете весь диалог (включая возможность перетаскивания диалога):

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class DisableEg extends JPanel {
   public static final String DISABLE_DIALOG_COMPONENTS = "Disable Dialog Components";
   public static final String ENABLE_DIALOG_COMPONENTS = "Enable Dialog Components";
   public static final String DISABLE_DIALOG = "Disable Dialog";
   public static final String ENABLE_DIALOG = "Enable Dialog";
   private static final int LOC_SHIFT = 150;
   private Analyzer analyzer;

   public DisableEg(JFrame frame) {
      analyzer = new Analyzer(frame);
      analyzer.pack();
      analyzer.setLocationRelativeTo(frame);
      Point location = analyzer.getLocation();
      location = new Point(location.x - LOC_SHIFT, location.y - LOC_SHIFT);
      analyzer.setLocation(location);
      analyzer.setVisible(true);

      add(new JButton(new AbstractAction(DISABLE_DIALOG_COMPONENTS) {

         @Override
         public void actionPerformed(ActionEvent evt) {
            AbstractButton btn = (AbstractButton) evt.getSource();
            if (btn.getText().equals(DISABLE_DIALOG_COMPONENTS)) {
               btn.setText(ENABLE_DIALOG_COMPONENTS);
               analyzer.setComponentEnabled(false);
            } else {
               btn.setText(DISABLE_DIALOG_COMPONENTS);
               analyzer.setComponentEnabled(true);
            }
         }
      }));
      add(new JButton(new AbstractAction(DISABLE_DIALOG) {

         @Override
         public void actionPerformed(ActionEvent evt) {
            AbstractButton btn = (AbstractButton) evt.getSource();
            if (btn.getText().equals(DISABLE_DIALOG)) {
               btn.setText(ENABLE_DIALOG);
               analyzer.setEnabled(false);
            } else {
               btn.setText(DISABLE_DIALOG);
               analyzer.setEnabled(true);
            }
         }
      }));
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("Disable Example");
      DisableEg mainPanel = new DisableEg(frame);

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

@SuppressWarnings("serial")
class Analyzer extends JDialog {

   public Analyzer(JFrame frame) {
      super(frame, "Analyzer Dialog", false);
      JButton but = new JButton("test");
      setLayout(new FlowLayout());

      add(but);
      setPreferredSize(new Dimension(200, 200));
   }

   public void setComponentEnabled(boolean enabled) {
      setComponentEnabled(enabled, getContentPane());

      // !! if you have menus to disable, you may need instead
      // setComponentEnabled(enabled, this); // !!
   }

   private void setComponentEnabled(boolean enabled, Component component) {
      component.setEnabled(enabled);
      if (component instanceof Container) {
         Component[] components = ((Container) component).getComponents();
         if (components != null && components.length > 0) {
            for (Component heldComponent : components) {
               setComponentEnabled(enabled, heldComponent);
            }
         }
      }
   }

}
4 голосов
/ 23 февраля 2012

Типичный способ сделать это - использовать glassPane, но в Java 7 появился JLayer, который тоже должен выполнить эту задачу.

...