2012-02-23 1 views
5

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

EDIT: Вот пример кода.

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(); 
} 

} 
+0

пример кода добавлено. Вы говорите, что мне нужно перебирать все элементы управления и отключать их вручную? –

+1

Это не совсем образец, который мы ищем. Мы хотели бы видеть вашу попытку решить эту проблему. Рассматривали ли вы использование рекурсии для рекурсии через дерево контейнера/компонента JDialog, включение или отключение всех найденных компонентов? –

+0

Я согласен с Hovercraft ... setDisabled для каждого компонента, содержащегося в JDialog. – John

ответ

8

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

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); 
      } 
     } 
     } 
    } 

} 
+0

нормально, хорошая работа. +1 – Jasonw

4

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

+0

Если я правильно читаю вопрос OP, это не сработает, так как он хочет, чтобы компоненты отображали отключенный внешний вид. AFAIK, типичный способ сделать это - использовать рекурсию. –

+1

этот способ более чем confortable, GlassPane может быть цветным, таким простым и не доступным с помощью мыши, приятная нить +1 для обоих (@Pete отличный код ++++++++) – mKorbel

 Смежные вопросы

  • Нет связанных вопросов^_^