Java如何: proper GUI coding?

标签 java swing

这是一个很长的类,下面是我的“主要”类,它包含我的大部分 UI 逻辑及其所有监听器等。无论如何你可以看到我在一个类和整个类中插入了很多代码只是看起来不可读,但它确实有效。

  1. 我使用 Netbeans GUI 编辑器创建了 GUI 的最终外观
  2. Nebeans 生成的源代码为您提供私有(private)变量,允许您 与您添加到表单的所有组件进行交互。
  3. 我在记事本中打开了那个 Java 类,并删除了所有阻止我在 Netbeans 中编辑生成的代码的注释,现在我可以根据自己的喜好编辑整个类。

我在一个单独的包中有一个单独的 GUI 类,我在我的 initUI() 函数中调用该类,然后从这里我引用所有组件并编写将这些组件作为参数获取并添加特定的方法这些组件的听众。我还通过方法 setter/getter 引用了每个 GLOBAL 变量,而不是直接引用它们。如您所见,函数列表堆积在 initUI() 中,而我还没有完成一半。

I am guessing this is not even near professional approach, could you please provide me whit newbie tip, examples and suggestions how to improve all this code because even tho all this is working as it should it is very very ugly to look at and there are no books or tutorials that explain how approach coding a larger application.

Also even tho i am mid way done whit this GUI i like to experiment and i have been told that JavaFX is much better for doing Java GUI and that code you get is much more pleasing that what you would get as in Java Swing but on the other hand there is a lot of down vote for JavaFX regarding that its not really fully ready for use.

无论如何,这是我的代码:

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

    }

}

最佳答案

  1. 首先要做的是.. 永远不要使用 Netbeans GUI 来拖放您的组件。这很容易,但以后会导致很多问题。如果您调整窗口大小,您的所有组件都不会正确调整大小,如果您想稍后动态添加组件,您将受到影响。而是使用一个好的布局管理器。 jdk自带的不好用,试试这个: http://www.jgoodies.com/freeware/forms/

  2. 接下来,如果您要制作一个巨大的框架,最好将它分成多个面板。每个面板在一个单独的类中。这将使您能够轻松地管理小型 GUI。不要在代码中乱放匿名内部类。相反,让该类实现一个监听器并在 actionPerformed() 方法中使用 if block 来处理您的操作。使您的代码更具可读性。否则使用 Actions 并传递它们。

  3. 在另一个线程上执行所有长时间运行的操作,例如访问数据库或读取/写入文件。否则您的 GUI 将卡住。使用 Swing Worker - http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html 这会在一定程度上迫使你以MVC方式思考。之后由你来分开你的类(class),这样 M、V 和 C 都是分开的。

关于Java如何: proper GUI coding?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8643386/

相关文章:

java - 如何在 JPanel 上定位/布局组件?

java - JButton在设置背景图片后显示多次

java - 在 Java 中,监视追加文件的最佳/最安全模式是什么?

java - Spring Boot 应用程序在尝试运行时抛出启动失败错误

java - 如何使用 Java 过滤器重定向用户(如果已登录)

java - 如何使用IAdaptable类创建工作集? [Eclipse 插件]

java - JPanel 获取 PaintComponent 在输入子项时被调用

java - 我的 QuickSort 实现存在问题

Java Swing 游戏板

java - 在 GUI 中显示文本冒险