2013-11-25 4 views
1

많은 구성 요소 (JButtons, JLabels, JComboBoxes, JSpinners 등)가있는 복잡한 GUI가 있습니다. 그래서 여러 클래스에 분할해야합니다 (JPanels에 컴포넌트를 추가해야합니다.이 JPanels는 더 큰 JPanels에 추가되며, JPanels는 JTabbedPane에 추가되고 JTabbedPane은 JFrame에 추가됩니다). 사용자에 따라 다르며 일부 구성 요소가 활성화되거나 비활성화되었거나 일부 값을 가져 와서 편집 할 수 없도록 설정합니다 (단어 - 상호 작용). 구성 요소 (상호 작용하는 요소)가 같은 클래스에 있지만, 다른 클래스에만있는 경우 - 결과가 ... AAA !!!다른 클래스에있는 스윙 구성 요소 간의 상호 작용 방법

나는 내가 필요한 것을 explane하는 간단한 예제를 만들었다. 네 가지 수업이 있습니다. 첫 번째는 JFrame의를 생성하고 JTabbedPane에 추가 :

public class MainFrame extends JFrame { 

MainFrame() { 
    super("MainFrame"); 
    go(); 
} 

public void go() { 
    Tabs tabs = new Tabs(); 
    getContentPane().add(tabs); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(500, 300); 
    setVisible(true); 
} 

public static void main(String[] args) { 
    MainFrame frame = new MainFrame(); 
} 

}

두 번째 클래스는 JTabbedPane에를 만들고 탭으로 두 JPanel의를 추가합니다. 둘째 tab.setEnabledAt (1, 거짓)

public class Tabs extends JTabbedPane { 

public Tabs() { 
    go(); 
} 

public void go() { 
    TabData data = new TabData(); 
    add(" Data ", data); 
    TabCalculation calculation = new TabCalculation(); 
    add("Calculation", calculation); 
    setEnabledAt(1, false); 
} 

}

번째 클래스 JComboBox에 함께 JPanel을 만들기 :

public class TabData extends JPanel { 

public TabData() { 
    go(); 
} 

JComboBox someData; 

public void go() {  
    String type[] = { " ", "Type 1", "Type 2", "Type 3" }; 
    someData = new JComboBox(type); 
    add(someData); 
    someData.addActionListener(new DataListener()); 
} 

public class DataListener implements ActionListener { 

    public void actionPerformed(ActionEvent ev) {   
     if (someData.getSelectedIndex() > 0) { 
      Tabs tabs = new Tabs(); 
      tabs.setEnabledAt(1, true); 
     } 
    } 
} 

}

... 및 제 클래스들을 만들 JPanel. 이 JPanel이 비활성화 된 두 번째 탭입니다. 사용자가 JComboBox (selectedIndex> 0)에서 일부 값을 설정할 때 - 탭을 활성화해야합니다. 하지만 Tabs tabs = new Tabs(); tabs.setEnabledAt(1, true); 도움을받지 못했습니다 ...

어떻게해야합니까? 도와주세요!!! 나는 잠을 잘 수가 없어 ... 나는 일할 수 없다. 나는 항상 그것에 대해 생각하고 해결책을 찾으려고 노력한다 ...

+0

우리에게 4 등급을 보여줍니다. 그리고이 방법으로 클래스를 게시하는 대신 모든 클래스를 단일 파일에 저장하고 실행 가능하고 컴파일 가능하며 문제를 재현 할 수있는 [SSCCE] (http://sscce.org)를 작성하십시오. 귀하의 게시 된 코드가별로 의미가 없습니다 – Sage

+0

각 구성 요소 그룹이 이야기 할 수있는 모델을 설정하고 변경 사항을 관찰하고 /하거나 어떤 유형의 관찰자 패턴을 설정하여 어떤 종류의 콜백/다른 그룹의 청취자가 필요에 따라 변경 사항에 응답합니다 ... – MadProgrammer

답변

1

사용자가 JComboBox (selectedIndex> 0)에서 어떤 값을 설정할 때 - 탭을 활성화해야합니다.

당신이 이러한 클래스 분할을 모두 가질 필요가 있다면, 나는 당신이 당신의 3 종의 변화하게 제안 :

public class TabData extends JPanel { 

    JComboBox someData; 

    ... 

    // Get rid of DataListener class and add this public method instead: 
    public void addActionListenerToComboBox(ActionListener listener) { 
     someData.addActionListener(listener); 
    } 
} 

을 그리고 당신의 2 등석이 변화합니다

public class Tabs extends JTabbedPane { 

    public Tabs() { 
     go(); 
    } 

    public void go() { 
     TabData data = new TabData();   
     data.addActionListenerToComboBox(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       JComboBox comboBox = (JComboBox)e.getSource(); 
       boolean enableSecondTab = comboBox.getSelectedIndex() > -1; 
       setEnabledAt(1, enableSecondTab); 
      } 

     }); 
     add(" Data ", data); 
     TabCalculation calculation = new TabCalculation(); 
     add("Calculation", calculation); 
     setEnabledAt(1, false); 
    } 
} 

자세한 내용은 EventObject.getSource() javadoc을 참조하십시오.

+0

많은 감사를드립니다. 너는 나를 다시 삶으로 인도한다. – user3033810