2010-04-26 41 views
17

Tôi có một số JComponent s trên JPanel và tôi muốn tắt tất cả các thành phần đó khi tôi nhấn nút Bắt đầu.Java Swing - Làm thế nào để vô hiệu hóa một JPanel?

Hiện nay, tôi đang vô hiệu hóa tất cả các thành phần một cách rõ ràng bởi

component1.setEnabled(false); 
: 
: 

Nhưng Có anyway mà tôi có thể vô hiệu hóa tất cả các thành phần cùng một lúc? Tôi đã cố vô hiệu hóa các JPanel mà các thành phần này được thêm vào bởi

panel.setEnabled(false); 

nhưng nó không hoạt động.

+0

Tại sao mọi người sẽ làm điều này? Có vẻ dễ dàng hơn để đặt các thành phần Swing trên một JDialog mà bạn làm cho vô hình khi người dùng nhấp vào nút Ok (có thể được đổi tên thành Bắt đầu). –

Trả lời

21

Bảng điều khiển phải có phương thức getComponents() có thể sử dụng trong vòng lặp để tắt các thành phần phụ mà không đặt tên chúng một cách rõ ràng.

+0

+1 Tôi đã sử dụng cái này. Tuy nhiên, cảnh báo, nếu các thành phần con của bạn là các vùng chứa (ví dụ: các hộp được sử dụng để quản lý bố cục) thì bạn cần thực hiện nó một cách đệ quy. Ngoài ra, nếu bạn có các thành phần bị vô hiệu vì các lý do khác thì việc bật lại sẽ đánh bại chúng. – staticman

+1

Đồng ý với staticman, nó là một hành vi nguy hiểm và bạn cần quan tâm khi sử dụng nó bởi vì bạn sẽ kích hoạt lại mọi thứ nếu bạn không có một số cảnh báo. Có lẽ nó không phải là một vấn đề cho trường hợp của bạn sau đó bạn có thể như thế này. Hoặc nếu nó là một pb, sau đó bạn có thể sẽ phải ghi nhớ các trạng thái của các thành phần trước khi de-enable chúng để thiết lập lại chúng trong trạng thái tốt. –

+0

Một chút khéo léo, nhưng tôi sẽ không nói nguy hiểm. Cách tiếp cận bình thường của tôi sẽ là phân lớp 'JPanel' và ghi đè phương thức' setEnabled() '. Ở đó tôi sẽ tự kích hoạt/vô hiệu hóa các thành phần phụ thích hợp, dựa trên trạng thái bên trong. – ZeissS

3

Disabled Panel cung cấp hỗ trợ cho hai phương pháp tiếp cận. Một để đệ quy vô hiệu hóa các thành phần, các khác để "sơn" bảng điều khiển với một cái nhìn tàn tật.

2

Phương pháp sau đây sử dụng đệ quy để đạt được điều này. Vượt qua bất kỳ số Container nào và phương thức này sẽ trả về một mảng Component của tất cả các thành phần không chứa trong bất kỳ vị trí nào "bên trong" của Container.

private Component[] getComponents(Component container) { 
     ArrayList<Component> list = null; 

     try { 
      list = new ArrayList<Component>(Arrays.asList(
        ((Container) container).getComponents())); 
      for (int index = 0; index < list.size(); index++) { 
       for (Component currentComponent : getComponents(list.get(index))) { 
        list.add(currentComponent); 
       } 
      } 
     } catch (ClassCastException e) { 
      list = new ArrayList<Component>(); 
     } 

     return list.toArray(new Component[list.size()]); 
     } 
    } 

Chỉ cần lặp qua các phần tử của mảng được trả về và vô hiệu hóa các thành phần.

for(Component component : getComponents(container)) { 
    component.setEnabled(false); 
} 
0

Phương pháp sau đây phải được tất cả những gì bạn cần phải thêm, bạn có thể gọi nó với setEnableRec(panel, true) hoặc setEnableRec(panel, false):

private void setEnableRec(Component container, boolean enable){ 
    container.setEnabled(enable); 

    try { 
     Component[] components= ((Container) container).getComponents(); 
     for (int i = 0; i < components.length; i++) { 
      setEnableRec(components[i], enable); 
     } 
    } catch (ClassCastException e) { 

    } 
} 
+0

nếu bạn di chuyển lệnh đầu tiên 'container.setEnabled (enable)' bên trong vùng đánh bắt, thì bạn có thể giữ chức năng nhất định của các vùng chứa, ví dụ: 'JTabbed' vẫn có thể nhấp được. –

+0

cũng phải cẩn thận vì nếu một phần tử phải được giữ trong vòng lặp bật, thì phương pháp này sẽ ghi đè mọi thứ. –

0

Vô hiệu hóa nên xảy ra một cách đệ quy:

Queue<Component> queue = new LinkedList<>(Arrays.asList(container.getComponents())); 
while(!queue.isEmpty()) { 
    Component head = queue.poll(); 
    head.setEnabled(enable); 
    if(head instanceof Container) { 
     Container headCast = (Container) head; 
     queue.addAll(Arrays.asList(headCast.getComponents())); 
    } 
} 
Các vấn đề liên quan