2014-01-30 164 views
1
添加共享按鈕

大家好,我一直用這個作爲我的指導和我的代碼基礎,我一直在努力:跨越JTabbedPane的

Java Source

我想要做什麼,是在所有窗格中添加一個共享按鈕。我不想爲每個按鈕聲明一個唯一的按鈕,但是要共享一個按鈕。我首先想到的是改變幀的BoxLayout,只是折騰按鈕將其添加的窗格框架後:

private static void createAndShowGUI() { 
    //Create and set up the window. 
    JFrame frame = new JFrame("test"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLayout(new BoxLayout(frame, BoxLayout.PAGE_AXIS)); 

    //Add content to the window. 
    //frame.add(new GUI(), BorderLayout.CENTER); 
    frame.add(new GUI()); 

    //setup Find button 
    //findButton.setSize(110,55); 
    findButton.setText("Find"); 
    findButton.setVisible(true); 

    //add button to frame 
    frame.add(findButton); 

不過,我得到一個運行時錯誤:BoxLayout的不能共享。所以現在我在這裏結束。當我看看爲什麼我收到這個錯誤時,有人能告訴我這是否正確嗎?

回答

2

建議:

  • 考慮將一個JButton在一個JPanel是低於或JTabbedPane的上方,使得它始終是可見的,而你只需要一個按鈕。
  • 或者,如果它必須位於標籤中的組件中,那麼每個標籤都需要它自己的獨特JButton,但它們可以共享相同的Action,這是我建議你做的:創建一個擴展AbstractAction的內部私有類,創建這個內部類的一個實例,通過JButton的構造函數或其方法將它傳遞給每個JButton。
  • 您的BoxLayout問題與您的原始問題完全無關,甚至不應該成爲本討論的一部分。是的,必須在一個容器中使用BoxLayout,並將該容器傳遞給BoxLayout。可能你將它添加到JFrame,但在現實中,這也增加了到JFrame的contentPane的,所以這個工作,你必須通過frame.getContentPane()到的BoxLayout的第一個構造函數參數:

frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS)); 

這是我不喜歡直接在頂層窗口添加組件或設置佈局的原因之一,因爲它不過是誤導性的語法糖。

我更喜歡:

JPanel contentPane = (JPanel) frame.getContentPane(); 
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.PAGE_AXIS)); 
+0

謝謝你,你的最終選擇做的伎倆。提到BoxLayout的原因是,因爲這是我試圖解決這個問題。它還展示了我試圖在物理上實現的佈局。我喜歡總是展示我所採取的路線。這可以導致我想要做的更好的想法和/或討論爲什麼它可能不是最好的方法。感謝3個選項。我要走3號門:D。 – whitewolfpgh

+0

我仍然是gui等的新手,並且在一年之內沒有碰到過java。最後,有動力回到它。感謝關於構造函數和getContentPane()的提醒,這是我以前忽略的內容,並且確實需要提交內存。 – whitewolfpgh

+0

@whitewolfpgh:不客氣,很高興幫助。 –