2011-12-27 89 views
2

這是一個很長的,bellow是我的「主要」類,擁有我的UI邏輯和所有的聽衆等的大部分。總之你可以看到我堅持了很多代碼在一個類和整個事情只是似乎不可讀,但它確實有效。Java如何:正確的GUI編碼?

  1. 我創建了GUI絲毫的最終外觀的Netbeans GUI編輯
  2. 通過Nebeans生成的源代碼給你私有變量,讓你 互動白衣您添加到窗體中的所有組件。
  3. 我在記事本中打開了Java類,並且刪除了所有阻止我在Netbeans中編輯生成的代碼的註釋,現在我可以根據自己的喜好編輯整個類。

我有一個單獨的包我調用類的我initUI()功能,然後從這裏我引用的所有組件,並編寫獲取這些組件作爲參數的方法,並添加特定監聽到一個單獨的GUI類這些組件。我還引用每個GLOBAL變量,而不是直接引用它們。正如你所看到的函數列表在initUI()堆積,我甚至沒有一半的路。

我猜測這是不是甚至接近專業的方法,你能 請提供給我絲毫的新手提示,實例和建議,就如何 改善這一切的代碼,因爲即使壽這一切都是因爲它的工作 應該是非常非常難看,有沒有書籍教程,說明如何編碼一個更大的應用程序的方法。

而且即使壽我是中期的方式完成白衣這個GUI我喜歡實驗和 我已被告知,JavaFX是多的做Java GUI更好, 你的代碼是更令人高興的是什麼,你會得到如在 的Java Swing,但是,從另一方面也可以 關於JavaFX的很多投下來,它沒有真正完全投入使用。

反正這裏是我的代碼:

package ept.controller; 

import ept.view.EPTMain; 
import ept.model.EPTEvent_Model; 
import ept.model.EPTLocal_Model; 
import ept.model.EPTModule_Model; 
import java.awt.Font; 
import java.awt.MouseInfo; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.DefaultListModel; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JOptionPane; 
import javax.swing.JProgressBar; 


public class EPTIndex_Controler { 

    public EPTIndex_Controler() { 
     initUI(); 
    } 

    //Globals 
    protected String selectedTower = null; 
    protected Integer selectedModules = 0; 

    public void setSelectedTower(String tower){ 
     this.selectedTower = tower; 
    } 

    public String getSelectedTower(){ 
     return this.selectedTower; 
    } 

    public void setSelectedModules(Integer i){ 
     this.selectedModules += i; 
    } 

    public void decrementSelectedModule(Integer i){ 
     this.selectedModules -= 1; 
    } 

    public Integer getSelectedModules(){ 
     return this.selectedModules; 
    } 

    private void initUI(){ 
     EPTMain runnable = new EPTMain(); 

     JLabel towerName = runnable.tower_name; 
     JComboBox towerSelect = runnable.tower_selection; 

     JLabel shield_ = runnable.shield_amount; 
     JLabel armor_ = runnable.armor_amount; 
     JLabel em_  = runnable.em_amount; 
     JLabel th_  = runnable.th_amount; 
     JLabel kn_  = runnable.kn_amount; 
     JLabel ex_  = runnable.ex_amount; 

     JProgressBar cpu_bar = runnable.cpu_bar; 
     JProgressBar cap_bar = runnable.capacitor_bar; 

     JList mod_browse = runnable.module_browser; 
     JList mod_select = runnable.selected_modules; 
     Font decode = new Font("monospaced", Font.PLAIN, 12); 
     mod_select.setFont(decode); 
     //mod_browse.setFont(decode); 

     setTowerName(towerName, towerSelect, shield_, armor_, em_, th_, kn_, ex_, cap_bar, cpu_bar); 
     removeTower(towerName, shield_, armor_, em_, th_, kn_, ex_, cap_bar, cpu_bar); 

     addModule(mod_browse, mod_select, shield_, armor_, em_, th_, kn_, ex_, cap_bar, cpu_bar); 
     removeModule(mod_select, shield_, armor_, em_, th_, kn_, ex_, cap_bar, cpu_bar); 
     runnable.setExtendedState(EPTMain.MAXIMIZED_BOTH); 
     runnable.setVisible(true); 
    } 



    protected DefaultListModel struct = new DefaultListModel(); 

    private void removeModule(final JList select, final JLabel shield_, final JLabel armor_, final JLabel em_, final JLabel th_, 
      final JLabel kn_, final JLabel ex_, final JProgressBar cap_bar, final JProgressBar cpu_bar){ 
     select.addMouseListener(new MouseListener(){ 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       String removable = select.getSelectedValue().toString(); 
       if(e.getClickCount() == 2 && removable.equals("No modules have been selected") == false){ 
        String cap = select.getSelectedValue().toString().substring(61, 70).trim(); 
        String cpu = select.getSelectedValue().toString().substring(75).trim(); 
        Integer D_CAP = Integer.valueOf(cap).intValue(); 
        Integer D_CPU = Integer.valueOf(cpu).intValue(); 
        decConsumedCap(D_CAP); 
        decConsumedCpu(D_CPU); 
        struct.removeElement(select.getSelectedValue()); 
        incrementVariables(shield_, armor_, em_, th_, kn_, ex_, cap_bar, cpu_bar); 
        select.setModel(struct); 
        decrementSelectedModule(1); 
       } 
      } 
      @Override 
      public void mousePressed(MouseEvent e) {} 
      @Override 
      public void mouseReleased(MouseEvent e) {} 
      @Override 
      public void mouseEntered(MouseEvent e) {} 
      @Override 
      public void mouseExited(MouseEvent e) {} 
     }); 
    } 


    private void addModule(final JList browse, final JList select, final JLabel shield_, final JLabel armor_, final JLabel em_, final JLabel th_, 
      final JLabel kn_, final JLabel ex_, final JProgressBar cap_bar, final JProgressBar cpu_bar){ 
     browse.addMouseListener(new MouseListener(){ 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       String addable = browse.getSelectedValue().toString(); 
       if(e.getClickCount() == 2 && getSelectedTower() != null && addable.charAt(0) == ' '){ 
          String data[] = new EPTModule_Model().moduleData(addable.trim()); 
          String module = data[0]; 
          Integer capacitor = Integer.valueOf(data[1]).intValue(); setConsumedCap(capacitor); 
          Integer cpu = Integer.valueOf(data[2]).intValue(); setConsumedCpu(cpu); 
          String module_cap = data[1]; 
          String module_cpu = data[2]; 
          if(getConsumedCap()+capacitor > getCap() || getConsumedCpu()+cpu > getCpu()){ 
           new EPTEvent_Model().eventNoCapOrCpu();      
          } else { 
           struct.addElement(String.format("> %-47s Capacitor: %-8s CPU: %s", module, module_cap, module_cpu)); 
           select.setModel(struct); 
           setSelectedModules(1); 
           incrementVariables(shield_, armor_, em_, th_, kn_, ex_, cap_bar, cpu_bar); 
          } 

       } else if (e.getClickCount() == 2 && getSelectedTower() == null){ 
        new EPTEvent_Model().eventNoTowerSelected(); 
       } 

      } 
      @Override 
      public void mousePressed(MouseEvent e) {} 
      @Override 
      public void mouseReleased(MouseEvent e) {} 
      @Override 
      public void mouseEntered(MouseEvent e) {} 
      @Override 
      public void mouseExited(MouseEvent e) {} 
     }); 
    } 

    private void removeTower(final JLabel type, final JLabel shield_, final JLabel armor_, final JLabel em_, final JLabel th_, 
      final JLabel kn_, final JLabel ex_, final JProgressBar cap_bar, final JProgressBar cpu_bar){ 
     type.addMouseListener(new MouseListener(){ 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       if(getSelectedModules() == 0){ 
        type.setText("No Control Tower Selected"); 
        setSelectedTower(null); 
        resetVariables(shield_, armor_, em_, th_, kn_, ex_, cap_bar, cpu_bar); 
       } else { 
        new EPTEvent_Model().eventModuleSelected(); 
       } 
      } 
      @Override 
      public void mousePressed(MouseEvent e) {} 
      @Override 
      public void mouseReleased(MouseEvent e) {} 
      @Override 
      public void mouseEntered(MouseEvent e) {} 
      @Override 
      public void mouseExited(MouseEvent e) {}  
     }); 
    } 

    private void setTowerName(final JLabel type, final JComboBox type2, final JLabel shield_, final JLabel armor_, final JLabel em_, final JLabel th_, 
      final JLabel kn_, final JLabel ex_, final JProgressBar cap_bar, final JProgressBar cpu_bar){ 
     type2.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if(getSelectedTower() != null){ 
        new EPTEvent_Model().eventTowerSelected(); 
       } else { 
        setSelectedTower(type2.getSelectedItem().toString()); 
        new EPTDispatch_Controler(type, type2.getSelectedItem().toString()); 
        updateVariables(shield_, armor_, em_, th_, kn_, ex_, cap_bar, cpu_bar); 

       } 
      } 
     }); 
    } 

    //Referenced Globals 
    protected int cap = 0; 
    protected int consumed_cap = 0; 
    protected int cpu = 0; 
    protected int consumed_cpu = 0; 

    public void setCap(int cap){ 
     this.cap = cap; 
    } 

    public int getCap(){ 
     return this.cap; 
    } 

    public void setCpu(int cpu){ 
     this.cpu = cpu; 
    } 

    public int getCpu(){ 
     return this.cpu; 
    } 

    public void resetConsumed(){ 
     this.consumed_cap = 0; 
     this.consumed_cpu = 0; 
    } 

    public void setConsumedCap(int consumed_cap){ 
     this.consumed_cap += consumed_cap; 
    } 

    public void decConsumedCap(int consumed_cap){ 
     this.consumed_cap -= consumed_cap; 
    } 

    public int getConsumedCap(){ 
     return this.consumed_cap; 
    } 

    public void setConsumedCpu(int consumed_cpu){ 
     this.consumed_cpu += consumed_cpu; 
    } 

    public void decConsumedCpu(int consumed_cpu){ 
     this.consumed_cpu -= consumed_cpu; 
    } 

    public int getConsumedCpu(){ 
     return this.consumed_cpu; 
    } 

    //Referenced Globals 
    protected int shield = 0; 
    protected int armor = 0; 
    protected double em = 00.00; 
    protected double th = 00.00; 
    protected double kn = 00.00; 
    protected double ex = 00.00; 

    public void setEm(double em){ 
     this.em = em; 
    } 

    public double getEm(){ 
     return this.em; 
    } 

    public void setTh(double th){ 
     this.th = th; 
    } 

    public double getTh(){ 
     return this.th; 
    } 

    public void setKn(double kn){ 
     this.kn = kn; 
    } 

    public double getKn(){ 
     return this.kn; 
    } 

    public void setEx(double ex){ 
     this.ex = ex; 
    } 

    public double getEx(){ 
     return this.ex; 
    } 

    public void setShield(int shield){ 
     this.shield = shield; 
    } 

    public int getShield(){ 
     return this.shield; 
    } 

    public void setArmor(int armor){ 
     this.armor = armor; 
    } 

    public int getArmor(){ 
     return this.armor; 
    } 

    private void setCL(JProgressBar t, int i){ 
     t.setValue(i); 
    } 

    private void incrementVariables(final JLabel shield_, final JLabel armor_, final JLabel em_, final JLabel th_, 
      final JLabel kn_, final JLabel ex_, final JProgressBar cap_bar, final JProgressBar cpu_bar){ 

     cap_bar.setMaximum(getCap()); 
     cap_bar.setValue(getConsumedCap()); 
     cap_bar.setString(getConsumedCap() + "/" + getCap()); 
     cap_bar.setStringPainted(true); 



     cpu_bar.setMaximum(getCpu()); 
     cpu_bar.setString(getConsumedCpu() + "/" + getCpu()); 
     cpu_bar.setStringPainted(true); 
     cap_bar.setValue(getConsumedCpu()); 

     String shieldA = String.valueOf(getShield()).toString(); 
     shield_.setText(shieldA); 

     String armorA = String.valueOf(getArmor()).toString(); 
     armor_.setText(armorA); 

     double e = getEm(); 
     String emT = String.valueOf(e); 
     em_.setText(emT); 

     double t = getTh(); 
     String thT = String.valueOf(t); 
     th_.setText(thT); 

     double k = getKn(); 
     String knT = String.valueOf(k); 
     kn_.setText(knT); 

     double x = getEx(); 
     String exT = String.valueOf(x); 
     ex_.setText(exT); 

    } 

    private void updateVariables(final JLabel shield_, final JLabel armor_, final JLabel em_, final JLabel th_, 
      final JLabel kn_, final JLabel ex_, final JProgressBar cap_bar, final JProgressBar cpu_bar){ 

     String data[] = new EPTLocal_Model().serializeData(getSelectedTower()); 

     Integer capA = Integer.valueOf(data[1]).intValue(); 
     setCap(capA); 
     cap_bar.setMaximum(getCap()); 
     cap_bar.setString(getConsumedCap() + "/" + getCap()); 
     cap_bar.setValue(getConsumedCap()); 
     cap_bar.setStringPainted(true); 

     Integer cpuA = Integer.valueOf(data[2]).intValue(); 
     setCpu(cpuA); 
     cpu_bar.setMaximum(getCpu()); 
     cpu_bar.setString(getConsumedCpu() + "/" + getCpu()); 
     cpu_bar.setValue(getConsumedCpu()); 
     cpu_bar.setStringPainted(true); 

     Integer shieldAmount = Integer.valueOf(data[3]).intValue(); 
     setShield(shieldAmount); 
     shield_.setText(data[3]); 

     Integer armorAmount = Integer.valueOf(data[4]).intValue(); 
     setArmor(armorAmount); 
     armor_.setText(data[4]); 

     Double emT = Double.valueOf(data[5]).doubleValue(); 
     setEm(emT); 
     em_.setText(data[5]); 

     Double thT = Double.valueOf(data[6]).doubleValue(); 
     setTh(thT); 
     th_.setText(data[6]); 

     Double knT = Double.valueOf(data[7]).doubleValue(); 
     setKn(knT); 
     kn_.setText(data[7]); 

     Double exT = Double.valueOf(data[8]).doubleValue(); 
     setEx(exT); 
     ex_.setText(data[8]); 

    } 

    private void resetVariables(final JLabel shield_, final JLabel armor_, final JLabel em_, final JLabel th_, 
      final JLabel kn_, final JLabel ex_, final JProgressBar cap_bar, final JProgressBar cpu_bar){ 

     resetConsumed(); 

     setCap(0); 
     cap_bar.setMaximum(getCap()); 
     cap_bar.setString(getConsumedCap() + "/" + getCap()); 
     cap_bar.setStringPainted(true); 

     setCpu(0); 
     cpu_bar.setMaximum(getCpu()); 
     cpu_bar.setString(getConsumedCpu() + "/" + getCpu()); 
     cpu_bar.setStringPainted(true); 

     setShield(0); 
     shield_.setText("0"); 

     setArmor(0); 
     armor_.setText("0"); 

     setEm(00.00); 
     em_.setText("00.00"); 

     setTh(00.00); 
     th_.setText("00.00"); 

     setKn(00.00); 
     kn_.setText("00.00"); 

     setEx(00.00); 
     ex_.setText("00.00"); 

    } 

} 
+0

首先,'whit'!='with'。其次,你提出的問題很不明確。如果你想用更優雅的方式來編寫Java代碼的圖形用戶界面,那麼很簡單,不要使用GUI生成工具包,因爲它們總是會產生醜陋和臃腫的代碼。 –

+0

生成的代碼不是代碼雜亂的問題,但所有事情都應該是可以編輯的,它提供了可以讓你引用外部類的所有組件的變量,我引用了我的直接2個問題。 請原諒我英語不好。 –

+1

您可以使用MVC或至少從實際應用程序邏輯中分離GUI代碼。 –

回答

4

Separation of concerns構建應用程序時是根本。

一種常見的設計模式來實現,這是Model-View-Controller,其是用於GUI應用程序的規範的設計方法。 Swing是建立在此之上,並將其「勢力」的開發商在考慮這種方法來設計的。

所以,如果你想在如何提高你的代碼,你應該學習MVC設計模式(數以千計的谷歌的例子),並重構代碼使用它的提示。

簡而言之,你將有3個邏輯上獨立的模塊,該Model將封裝數據/狀態,您View這將封裝的UI和Controller這將是你的應用的主要驅動力。

將代碼重構爲這種模式後,您將看到代碼更乾淨,更易維護且易於擴展。

+0

我正在嘗試將MVC模式應用到我的項目中,但由於沒有解釋如何對Java新手的某人進行解釋的資源,所以它是一個地獄。 –

+0

@ kellax:有例子。 http://leepoint.net/notes-java/GUI/structure/40mvc.html和http://www.oracle.com/technetwork/articles/javase/index-142890.html,你可以在這裏搜索SO – Cratylus

+0

謝謝如果有什麼不清楚的地方,我會查找它們併發布後續問題 –

4
  1. 第一件事第一..永遠不要使用Netbeans GUI來拖放組件。它很容易,但稍後會導致很多問題。如果調整窗口大小,則所有組件都不能正確調整大小,如果您想稍後動態添加組件,則會受到影響。而是使用一個好的佈局管理器。附帶JDK的那些很難使用,試試這個: http://www.jgoodies.com/freeware/forms/

  2. 接下來,如果你是一個幀是巨大的,其最好的,你把它分解成板。每個面板都在一個單獨的類中。這將允許您輕鬆管理少量的GUI。不要用匿名內部類拋棄代碼。相反,讓類實現一個監聽器,並在actionPerformed()方法中使用if塊來處理您的操作。使您的代碼具有一點可讀性。否則使用操作並傳遞它們。

  3. 做所有長時間運行的東西,如訪問數據庫或讀/寫到另一個線程上的文件。否則,您的GUI將凍結。使用一個Swing Worker - http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html 這會迫使你在一定程度上以MVC方式思考。在那之後,你可以分開你的課程,這樣M,V和C都是分開的。