2013-07-10 56 views
5

我創建了幾個類來簡化像創建GUI,應用輔助功能設置,繪製圖形等過程,並且我已經走了很長的路;但我有一個想法,如果可以工作會很棒,我想知道是否有可能。在Java方法中傳遞未知類型的對象作爲參數

現在,我有一個「JFrameBuilder」類,以類似的方法:

/** 
* The "addButton" method adds a button to a JFrame 
* @param app The parent window (a JFrame) 
* @param text The button text 
* @param x The x-coordinate where the button should appear 
* @param y The y-coordinate where the button should appear 
* @param width The width of the button 
* @param height The height of the button 
* @return A JButton object (it returns an object so programs can manipulate it later) 
*/ 
public JButton addButton(JFrame app, String text, int x, int y, int width, int height) { 
     try { 
      JButton button = new JButton(); 
      button.setText(text); 
      button.setBounds(x, y, width, height); 
      app.add(button); 
      System.out.println("\"" + text + "\" button created."); 
      return button; 
     }catch(Exception e) { 
      System.out.println("Something went wrong when creating the \"" + text + "\" button."); 
      System.out.println(e.getStackTrace()); 
      return null; 
     } 
    } 

所以基本上所有它真的在做一種方法是設置多個屬性(無需編寫10-15行代碼每個對象)。這些工作很好,但我想進一步將其抽象化,這些方法可以與JApplet,JPanel和其他容器以及JFrame一起使用。這樣我可以將JFrameBuilder中的類推廣到更簡單的「AppBuilder」,「GUIBuilder」等,並且可以在其他項目中使用它。

但要做到這一點,我需要傳遞一個未知類型的對象作爲方法中的參數。所以我嘗試用「Object」替換「JFrame」,然後使用String來標識它的類型,並嘗試根據它進行更改。但是,我使用諸如「add」之類的方法遇到了一些麻煩;我在想這是因爲Object沒有添加方法(即使JPanel是對象類型和JPanel)。爲了澄清一點,基本上我需要做的是找出按鈕/標籤/任何應該添加的容器(「父母?」)。到目前爲止,我知道要做到這一點的唯一方法是將它作爲參數傳遞給方法;如果還有其他方法,我想要了解它,但是如果沒有,那麼理想地傳遞未知類型的變量似乎是最好的方法。這樣,在方法內部會有一些東西來標識類型,並根據它的下一個動作(例如,如果可以顯示其他對象,添加它,如果沒有,則捕獲異常)。

所以我檢查了這個網站上的類似問題(這實際上是我從中得到Object的想法),也搜索了一下,但沒有運氣。因此,我一如既往地欣賞任何建議或其他想法。

謝謝。 :)

+0

你的JFrame從未在該方法中使用..和不在catch塊中返回null ..並且不要使用'setBounds' ..看看有很多關卡的swing繼承(這不是很好),但可能你可以找到像'JComponent' – nachokk

+0

參數類型將取決於你想要做什麼。它可以和'Container'一樣基本,或者如果是頂級窗口然後是'Window'類型。我自己,我用我的GUI來創建JPanels,但不是頂級窗口。這樣我可以添加JPanels以添加到我喜歡的任何容器中。順便說一句'setBounds(....)'?不,不要這樣做。使用佈局管理器。 –

回答

3

使用Generics,創建一個用於將JButton添加到T組件的抽象。

運行的代碼

import java.awt.BorderLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

import java.awt.BorderLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class AdderExample { 
    public static void main(String[] args){ 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame("Demo"); 
       frame.getContentPane().setLayout(new BorderLayout()); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       /* Use JFrameAdder if you want to add to a JFrame 
       * ---------------------------------------------- */ 
       JPanel panel = new JPanel(); 
       addButton(panel, new JPanelAdder(), "blah", 10, 10, 100, 10); 
       frame.getContentPane().add(panel); 

       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
    public static <T> JButton addButton(T app, Adder<T> adder, String text, int x, int y, int width, int height) { 
     try { 
      JButton button = new JButton(); 
      button.setText(text); 
      button.setBounds(x, y, width, height); 
      adder.add(button, app); 
      System.out.println("\"" + text + "\" button created."); 
      return button; 
     }catch(Exception e) { 
      System.out.println("Something went wrong when creating the \"" + text + "\" button."); 
      System.out.println(e.getStackTrace()); 
      return null; 
     } 
    } 
} 
interface Adder<E>{ 
    void add(JButton btn, E e); 
} 

class JFrameAdder implements Adder<JFrame>{ 
    @Override 
    public void add(JButton btn, JFrame e) { 
     e.getContentPane().add(btn); 
    } 
} 
class JPanelAdder implements Adder<JPanel>{ 
    @Override 
    public void add(JButton btn, JPanel e) { 
     e.add(btn); 
    } 
} 

此外,您可能是想說服自己,Null Layout is Evil和使用適當的layout manager你的目的

+0

美麗! 1+加入投票 –

+1

謝謝。這使我的一天:) – Bnrdo

+0

我也給了它+1!雖然我不知道爲什麼自己設置佈局(使用setLayout爲「null」和使用「setBounds」)會非常糟糕,但實際上它被認爲是「邪惡」(迄今爲止完美運行),我認爲您已經「頭部」。當我學習慣例以及爲什麼自定義佈局如此錯誤時,我相信我會明白爲什麼有那麼多人反對它。但是,您的評論是迄今爲止我在本網站上收到的最好的反饋 - 不僅僅是批評,還包括一些實際建議和幾個鏈接(所以我可以進一步研究)+一個實際的例子!謝謝! :) – user2403876

0

你想要一個動態方法來接受不同的類型來對它們執行不同的操作。我不認爲沒有方法的知識就可以添加它,因爲應該明確描述將按鈕添加到容器的邏輯。

最好的選擇是使用一個參數。我不建議使用對象類型,所以最好的選擇似乎是java.awt.Container。如果你要使用對象的類型,你必須投它基於類型屬性,你提到的 -

if(object.type.equals("Container")){ 
    Container container = object; 
} 

但我的建議是使用一個超類比上面的方法。希望這可以幫助你。

相關問題