2016-08-24 135 views
-1

我是新來的Java,並嘗試通過我的類創建一個按鈕,它有一個帶參數的方法。但是,當我創建我的課程的兩個實例時,它只顯示一個按鈕,即最新的一個。你能告訴我我在這裏做了什麼錯誤嗎?通過類創建按鈕

我的類文件

public class CreateButton { 
    int posx; 
    int posy; 
    int buttonWidth; 
    int buttonHeight; 
    public void newButton(int x, int y, int w, int h) { 
     posx = x; 
     posy = y; 
     buttonWidth = w; 
     buttonHeight = h; 
     JFrame f = new JFrame(); 
     JButton b = new JButton("Test"); 
     b.setBounds(posx, posy, buttonWidth, buttonHeight); 

     f.add(b); 
     f.setSize(400, 400); 
     f.setLayout(null); 
     f.setVisible(true); 

     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

我的文件

class Project { 
    public static void main(String[] args) { 
     CreateButton myButton1 = new CreateButton(); 
     CreateButton myButton2 = new CreateButton(); 
     myButton1.newButton(50, 200, 100, 50); 
     myButton2.newButton(100, 250, 100, 50); 
    } 
} 
+0

看起來像一個類的奇怪名稱,不僅創建一個按鈕,而且還創建一個框架。爲什麼不只是創建一個按鈕? – ChiefTwoPencils

+0

一般而言,如果您爲班級選擇的名稱是一個動詞短語,那麼您的設計必須有缺陷(或您的名字,或者您對所做事情的理解)。方法應該是「動詞」。類應該是「對象」。無論如何,你的按鈕都是在它自己的框架中創建的。當你關閉那個框架時,你沒有看到它後面的另一個按鈕的框架? – RealSkeptic

+0

是的,我明白了。謝謝 – Rajesh

回答

0

其實,你的代碼創建兩個按鈕,但JFrame窗口高於對方,所以你可以看到只有一個。移動窗口,你可以看到兩個按鈕。

要將按鈕添加到同一個框架,您需要從createButton()方法中刪除JFrame的創建,並將其作爲參數添加到函數中。在您的main()-方法中創建框架。

正如其他人已經評論,類的名稱有點「非標準」。如果您打算在那裏創建其他小部件,則更好的名稱是ButtonFactoryUIFactory。無論如何,考慮createButton()方法返回初始化的按鈕,而不是將它添加到JFrame爲您。這樣您將獲得靈活性,並且您可以更輕鬆地在單元測試中測試創建的按鈕參數。如果該按鈕被自動添加到框架中,則實現起來要複雜得多。

import javax.swing.*; 

public class CreateButton { 


    public static class UIFactory { 

     public JButton newButton(int posx, int posy, int buttonWidth, int buttonHeight) { 
      JButton b = new JButton("Test"); 
      b.setBounds(posx, posy, buttonWidth, buttonHeight); 

      return b; 
     } 

     public JFrame newFrame(int width, int height) { 
      JFrame f = new JFrame(); 
      f.setSize(width, height); 
      f.setLayout(null); 

      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      return f; 
     } 

     public JFrame mainWindow() { 
      JFrame f = newFrame(400, 400); 
      f.add(newButton(50, 200, 100, 50)); 
      f.add(newButton(100, 250, 100, 50)); 
      return f; 
     } 
    } 

    public static void main(String[] args) { 
     UIFactory ui = new UIFactory(); 
     JFrame main = ui.mainWindow(); 
     main.setVisible(true); 

     JFrame win2 = ui.newFrame(150, 150); 
     win2.setLocation(400, 400); 
     JButton b2; 
     win2.add(b2 = ui.newButton(50, 50, 100, 50)); 
     b2.addActionListener(e -> win2.setVisible(false)); 
     win2.setVisible(true); 
    } 
}