2013-11-25 22 views
1

我有一個複雜的GUI與許多組件(JButtons,JLabels,JComboBoxes,JSpinners等)。這就是爲什麼我必須將它拆分爲幾個類(向JPanel添加組件,此JPanel添加到更大的JPanels,此JPanels添加到JTabbedPane,並將JTabbedPane添加到JFrame)。 取決於用戶選擇和填寫數據某些組件啓用或禁用或獲得一些價值和設置不可編輯(在一個詞 - 交互)。如果組件(這是相互作用的)在同一個類中,但如果它只在不同的類中,那麼它很容易完成並且正常工作 - 任何結果...... AAA!如何在不同類中的Swing組件之間進行交互?

我做了一個簡單的例子來解釋我需要的東西。有四個類。第一個創建的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中並添加兩個JPanels爲選項卡。第二tab.setEnabledAt(1,FALSE):

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

向我們展示了第四堂課。而不是以這種方式發佈類,請將所有類都放在單個文件中,然後構建一個[SSCCE](http://sscce.org),它可運行,可編譯並能夠重新生成問題。您的發佈代碼沒有多大意義 – Sage

+0

您可能需要設置某種模型,以便每個組件組可以與觀察者交談並進行更改和/或設置某種觀察者模式,以允許您註冊某種回調/聽衆分組,並根據需要對其進行響應... – MadProgrammer

回答

1

當用戶在JComboBox中設置了一些值(selectedIndex> 0) - 選項卡必須啓用 。

如果你需要將所有這些類分,那麼我會建議你在你的第三類這種變化:

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); 
    } 
} 

,並在你的二等這種變化:

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

相關問題