2012-05-11 1 views
0

많은 구성 요소가있는 방대한 Gui가 있습니다. 일부 구성을 기반으로 모든 구성 요소의 활성화 상태를 업데이트하는 방법은 updateEnable()입니다.자바 스윙 : 구성 요소가 내가 말할 때까지 사용 가능 상태로 업데이트하지 못하도록하십시오.

private void updateEnable() { 
    enableAllRec(panel, true); 
    // disable some components 
} 

private void enableAllRec(Container root, boolean b) { 
    if (root == null) return; 
    for (Component c : root.getComponents()) { 
    c.setEnabled(b); 
    if (c instanceof Container) enableAllRec((Container) c, b); 
    } 
} 

나는 그런 식으로 그것을 할 이유는 일부 구성 요소가 저장되지 않는 것입니다 :

는 기본적으로 내가 먼저 true로 상태를 활성화 한 다음 (구성에 따라) 그들 중 일부를 사용하지 않도록 설정 멤버 변수와 나는 그것들에 접근 할 수 없다. 나는이 같은 그들 중 일부를 초기화 때문에 그들은 그러나 (예를 들어) 자신의 상태를 변경할 수 있습니다 : 나는 updateEnable()를 호출하는 경우가 있기 때문에 (저장) 구성 요소의 일부가 깜박일 수 있습니다 :

이제
final JLabel exampleLabel = new JLabel("yoink"); 
final JCheckBox exampleCheckBox = new JCheckBox("boing"); 
exampleCheckBox.addItemListener(new ItemListener() { 
    @Override 
    public void itemStateChanged(ItemEvent e) { 
    exampleLabel.setEnable(exampleCheckBox.isSelected()); 
    } 
}); 

내 문제는 다음과 같다 활성화 된 다음 잠시 후 다시 비활성화됩니다. 나는 그것을 방지하고 싶습니다. 내 생각은 어떻게 든 updateEnable()의 끝까지 새로 고침에서 GUI를 방지 한 다음 updateUI()을 수행하는 것입니다. 그러나 이것은 매우 우아하지 않고 GUI 업데이트를 방지하는 방법을 알지 못합니다.

이 문제에 대한 매우 우아한 대체 솔루션이 누락 되었습니까?

덕분에 많이, 스테판

+1

[여기] (http://stackoverflow.com/questions/4065456/prevent-java-from-repainting-the-content-of-a-jpanel-while-updating)에서 답을 찾을 수 있습니다. – Grims

+0

고마워, 그게 내가 찾고 있었던 바로 그거야. 더 우아한 방법에 대한 아이디어가 내 마음에 왔지만. 잘 작동하면 답변을 게시 할 것입니다. – brimborium

+0

좋아, 지금 내 현재 솔루션을 게시하고 그것이 나를 위해 잘 작동하는 것으로 받아 들였다. 내가 gui의 모든 구성 요소를 포함하는 맵을 생성하고 싶지는 않지만 캐러린 아이디어도 가능합니다. 내 접근 방식은 내가 생각하는 특수한 경우 만 생성합니다. – brimborium

답변

0

좋아, 내 접근 방식이 작동하는 것 같습니다. 난 그냥 몇 가지 예외 사항이 포함되도록 enableAllRec(Container root, boolean b) 확장 :

private void enableAllRec(Container root, boolean defaultState, Set<Component> disableList, Set<Component> enableList) { 
    if (root == null) return; 
    for (Component c : root.getComponents()) { 
    if (disableList != null && disableList.contains(c)) { 
     c.setEnabled(false); 
     disableList.remove(c); 
    } else if (enableList != null && enableList.contains(c)) { 
     c.setEnabled(true); 
     enableList.remove(c); 
    } else c.setEnabled(defaultState); 
    if (c instanceof Container) enableAllRec((Container) c, defaultState, disableList, enableList); 
    } 
} 

이 방법은, 내가/확인 비활성화 활성화하려는 모든 구성 요소를 determen 수, 해당 세트에 추가하고 enableAllRec 전화 thenn. 예 :

Set<Component> enableList = new HashSet<Component>(); 
enableList.add(searchFreqButton); 
enableList.add(advMeasButton); 
enableAllRec(configPanel, false, null, enableList); 

분명히, 이것은 큰 세트 적합하지 않습니다,하지만 내 요구에 충분하다 (800 개 구성 요소 및 세트는 더 이상 20 ~ 30 arround를 이상의 성분을 함유을 arround). 나는이 방법이 더 큰 세트를 쉽게 처리 할 것으로 의심한다.

위의 예에서 disableList를 도입하는 것은 의미가 없습니다 (기본적으로 모든 구성 요소가 기본적으로 비활성화 됨). 따라서 기본값에 따라 해당 집합을 생략 할 수 있습니다. 이것은 바람직하게는 enableAllRec()에서해야합니다.

1

이 경우 귀하의 구성 요소를 사용할 수 있습니다/비활성화 (때문에) 논리적 인 변화와 계산에 연속으로 몇 번 - 당신이 시각적으로 일부 변경 사항을 적용하기 전에 계산을 수행해야 구성 요소. 이 경우 구성 요소 상태를 최종 상태로 곧바로 변경합니다.

+0

여기에서의 문제는'Container.getComponents()'를 제외하고는 그 중 일부에 접근 할 수 없다는 것입니다. – brimborium

+1

Map 과 같은 일부 맵에 두 번의 실행 또는 캐시 최종 상태를 작성한 후 그 맵을 통해 실행하면 최종 값이 구성 요소의 setEnabled 메소드에 설정됩니다. –

+0

캐싱 아이디어는 모든 구성 요소의 Map을 생성 할지라도 좋을 것입니다. 대부분의 구성 요소가'enableAllRec()'기본 설정으로 잘되어 있기 때문에 필요하지 않습니다. – brimborium

관련 문제