2012-02-23 9 views
5

बनाने के लिए कैसे मैं जेडियलॉग-आधारित विंडो निष्क्रिय करना चाहता हूं, इसलिए सभी नियंत्रण अक्षम अक्षम (ग्रे रंग में)। setEnabled (झूठा) किसी भी नियंत्रण, यहां तक ​​कि बंद खिड़की पर क्लिक करना असंभव बनाता है। लेकिन कुछ भी ग्रे बदल जाता है। कृपया मदद करें।JDialog निष्क्रिय

संपादित करें: यहां नमूना कोड है।

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

मैं होवरक्राफ्ट से सहमत हूं ... जेडीअलॉग में प्रत्येक घटक पर सेट किया गया है। – 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 उपयोग करने के लिए है, लेकिन जावा 7 शुरू की JLayer कि चाल भी करना चाहिए।

+0

यदि मैं ओपी के प्रश्न को सही तरीके से पढ़ रहा हूं, तो यह काम नहीं करेगा क्योंकि वह घटक को अक्षम उपस्थिति प्रदर्शित करना चाहता है। AFAIK, ऐसा करने का सामान्य तरीका रिकर्सन का उपयोग करना है। –

+1

इस तरह confortable से अधिक है, ग्लासपेन रंग, इतना आसान और माउस द्वारा accesible नहीं हो सकता है, दोनों के लिए अच्छा धागा +1 (@Pete महान कोड ++++++++) – mKorbel

संबंधित मुद्दे