2012-02-23 29 views
5

Tôi muốn làm cho cửa sổ dựa trên JDialog không hoạt động, vì vậy tất cả các điều khiển đều bị vô hiệu hóa (màu xám). setEnabled (false) chỉ làm cho không thể nhấp vào bất kỳ điều khiển nào, thậm chí là đóng cửa sổ. Nhưng không có gì chuyển sang màu xám. Xin vui lòng giúp đỡ.cách làm cho JDialog không hoạt động

EDIT: Đây là mã mẫu.

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

mẫu mã thêm. Bạn có nói rằng tôi cần phải lặp qua tất cả các điều khiển và vô hiệu hóa chúng bằng tay? –

+1

Đó không phải là mẫu mà chúng tôi đang tìm kiếm. Chúng tôi muốn thấy nỗ lực của bạn để giải quyết vấn đề này. Bạn đã xem xét sử dụng đệ quy để recurseion thông qua container/thành phần cây của JDialog, cho phép hoặc vô hiệu hóa tất cả các thành phần được tìm thấy? –

+0

Tôi đồng ý với Hovercraft ... setDisabled trên mỗi thành phần mà JDialog chứa. – John

Trả lời

8

Hai cách mà tôi biết để làm được điều này, một trong những nơi bạn vô hiệu hóa các thành phần của một hộp thoại đệ quy, và thứ hai, nơi bạn vô hiệu hóa toàn bộ hộp thoại (bao gồm cả khả năng để kéo hộp thoại):

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

ok, công việc tốt đẹp. +1 – Jasonw

4

Cách điển hình để thực hiện việc này là sử dụng glassPane, nhưng Java 7 đã giới thiệu JLayer cũng nên thực hiện thủ thuật.

+0

Nếu tôi đọc câu hỏi của OP một cách chính xác, điều này sẽ không hoạt động khi anh ta muốn các thành phần hiển thị một hình dạng bị vô hiệu hóa. AFAIK, cách điển hình để làm điều này là sử dụng đệ quy. –

+1

cách này là nhiều hơn confortable, GlassPane có thể được màu, rất đơn giản và không accesible của chuột, đẹp thread 1 cho cả hai (@Pete tuyệt vời mã ++++++++) – mKorbel

Các vấn đề liên quan