8
votes

Java - faire des projets d'interface graphique à grande échelle

Pour obtenir directement à ma question.

Comment faites-vous des projets d'interface graphique à grande échelle? Je n'ai pas fait de plus grands projets d'interface graphique à Java jusqu'à présent, mais ce que je travaille à l'heure actuelle est devenu assez rapide et assez grand et maintenant je suis coincé avec une énorme tas de code qui est vraiment ennuyeux et en désordre. P>

Depuis que je viens du domaine du développement Web, je suis habitué aux frameworks MVC, alors j'ai 3 packages dans mon modèle de projets où je conserve des cours qui interagissent des fichiers whit ou de la DB, des vues où je garde mes classes pour les formulaires ou le paquet d'interface graphique et de contrôleur où je garde La majorité de ma logique. P>

On m'a dit de séparer ma logique également de garder des actions dans une classe et des auditeurs d'une autre classe, mais je ne sais pas comment lier tout cela. P>

Jusqu'à présent, je n'ai que 1 classe de contrôleur où j'exécute toutes les méthodes concernant ce qui se passe sur l'interface graphique une fois que cela est invoqué. P>

package pft.controller;


import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.JTree;
import java.awt.event.*;
import javax.swing.JProgressBar;
import pft.view.Invoke_GUI;
import pft.model.Events;
import pft.model.Parse;

public class Tower_Controller {

    public Tower_Controller() {
    }
    //Global variables
    String isSelected = null;
    int hasModules = 0;
    int cap = 0;
    int cpu = 0;
    int shield = 0;
    int armor = 0;

    public void setName(String name){
        this.isSelected = name;
    }

    public String getName(){
        return this.isSelected;
    }

    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 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;
    }


    public void invoke() throws IOException {
        Invoke_GUI runnable = new Invoke_GUI();
        final JLabel tower_name = runnable.tower_name;
        final JComboBox tower_select = runnable.tower_select;
        final JTree module_browser = runnable.module_browser;
        final JTree selected_modules = runnable.selected_modules;

        final JProgressBar cap_bar = runnable.cap_bar;
        final JProgressBar cpu_bar = runnable.cpu_bar;

        final JLabel em_res = runnable.em;
        final JLabel th_res = runnable.thermic;
        final JLabel ki_res = runnable.kinetic;
        final JLabel ex_res = runnable.explosive;

        setTowerName(tower_name, tower_select);
        removeTower(tower_name);
        runnable.setVisible(true);       

    }

    public void removeTower(final JLabel tower_name) {
        tower_name.addMouseListener(new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent e) {
                if (hasModules == 1 & isSelected != null) {
                    Events evt = new Events();
                    evt.towerHasModules();
                } else if (isSelected == null) {
                } else {
                    tower_name.setText("No Control Tower selected");
                    isSelected = null;
                }
            }

            @Override
            public void mousePressed(MouseEvent e) {
            }

            @Override
            public void mouseReleased(MouseEvent e) {
            }

            @Override
            public void mouseEntered(MouseEvent e) {
            }

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

    public void updateVariables(String name) throws IOException{
        Parse tower = new Parse();
        String data[] = tower.towerData(name);
        Integer x = Integer.valueOf(data[1]).intValue();
        setCap(x);
    }

    public void setTowerName(final JLabel tower_name, final JComboBox tower_select) {
        tower_select.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (isSelected != null) {
                    Events evt = new Events();
                    evt.towerSelected(isSelected);
                } else {
                    tower_name.setText(tower_select.getSelectedItem().toString());
                    setName(tower_name.toString());
                    try {
                        updateVariables(tower_name.toString());
                    } catch (IOException ex) {
                        Logger.getLogger(Tower_Controller.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        });
    }


}


2 commentaires

Jetez un coup d'œil au en.wikipedia.org/wiki/mediator_pattern


Voir aussi mvcgame .


3 Réponses :


3
votes

Le moyen le plus simple d'augmenter une interface graphique est de faire tout ce qui est suffisamment couplé. Les événements (swing et vous-même) sont le meilleur moyen de le faire. À moins qu'une classe crée ou montrant directement un élément d'interface graphique, il ne devrait pas savoir ou se soucier de quoi que ce soit d'autre dans l'interface utilisateur.

Le contrôleur devrait continuer à faire ce qu'il est censé faire - tirer des événements en réponse à d'autres événements. Mais ces événements devraient être des événements de niveau d'application définis par les besoins de votre application. Le contrôleur ne doit pas directement manipuler des éléments d'interface graphique. Au lieu de cela, vous devez créer des composants (peut-être des sous-classes de JWHATEver) qui s'inscrivent avec le contrôleur qui s'intéressent aux événements.

Par exemple, Créez une interface ToweReventListener avec un Naméchanged () fonction. Le contrôleur dispose également d'une fonction changeur () , qui, lorsqu'elle est appelée, met à jour le modèle (une classe de tour) puis appelle naméchanged () sur tous les TOWEREVENTLISTENNERS .

Ensuite, créez une classe TowerReNamer qui, par exemple, jdialog (c'est-à-dire une fenêtre contextuelle) qui inclut une zone de texte et un bouton OK avec une référence au contrôleur. Lorsque l'utilisateur clique sur OK, contrôleur.changetwerTerName () est appelé. Autres parties de votre interface graphique qui vous enregistrez comme remorquerienvenants recevra l'événement et la mise à jour au besoin (peut-être en mettant à jour un jlabel sur l'interface utilisateur).

Remarque, si vos besoins sont suffisamment simples, vous pouvez simplement utiliser PropertyChangeEvents et ne vous inquiétez pas de toute une structure d'interface d'événement. PropertyChangeSupport peut être utilisé par le contrôleur vers des notifications d'événement incendie.


0 commentaires

6
votes

Voici mon conseil pour le développement de la balançoire en général. Il discute de l'importance d'utiliser des contrôleurs pour combler les besoins de la vue et de l'interace du modèle.

Directives d'interface graphique pour Swing

Dernier projet Swing J'ai conçu une framework MVC qui utilise le ressort pour définir le modèle du programme et des contrôleurs, puis a utilisé des annotations dans le contrôleur pour Evénements métalliques envoyés par la vue sur les méthodes du contrôleur. La vue a eu accès au répartiteur de l'événement qui était un bus d'événement et des événements envoyés sur le bus appelé méthodes sur le contrôleur à travers les annotations. Cela a permis à tout contrôleur de répondre aux événements de la vue. Ainsi, comme un contrôleur est trop important, il était super simple pour refroidir chaque ensemble de méthodes dans un autre contrôleur, et la vue ou le modèle ne devait pas changer.

La beauté du bus de l'événement était-ce que cela pourrait être Partagé avec le modèle ainsi que le modèle pourrait envoyer des événements asynchrones que le contrôleur pourrait également s'inscrire. Il ressemblait à quelque chose comme: xxx

Une fois que ce cadre était en place, il était incroyable à quelle vitesse nous pourrions faire avancer les choses. Et cela s'est tenu assez bien que nous avons ajouté des fonctionnalités. J'ai fait ma belle part de grands projets swing (3 à ce jour) et cette architecture a fait une énorme différence.


1 commentaires

Votre cadre semble être vraiment intéressant mais pourriez-vous ajouter plus de détails sur le modèle et la vision? (Je voudrais mettre en œuvre votre cadre) J'ai le même problème que la duchesse sterling, mais je ne connais pas les annotations printemps et java :(



2
votes

En plus du grand conseil déjà donné, je vous recommanderais de lire une partie de ce que trygve reenskaug a écrit et / ou enregistré sur sa page MVC . Il était là pendant le développement de ce style architectural à la fin des années 70. Son rapport technique de deux pages intitulé modèles - Vues - Les contrôleurs de décembre 1979 présentent la description la plus concise du modèle, de la vue et du contrôleur.

de note particulière, les vues sont à la fois les observateurs et manipulateurs du modèle. Le contrôleur est principalement préoccupé par l'organisation (câblage) des vues et traduire l'entrée de l'utilisateur en interactions avec le modèle. Plusieurs des frameworks MVC offrent le contrôleur relayant des données du modèle à la vue - c'est tout simplement faux. Un Papier de plus tôt en 1979 Inclus le concept d'un éditeur comme composite de vues connexes. L'éditeur a été rejeté; Sa fonctionnalité a été déplacée dans le contrôleur et la vue.

Un autre article qui est bon pour décrire comment appliquer cette directive est Burbeck's Comment utiliser le manuel-View-contrôleur . Il est écrit avec SmallTalk à l'esprit afin qu'il ne se traduisait pas facilement à Java, mais c'est une bonne description de l'application de la ligne directrice.

Je pense que la chose la plus importante à considérer est que le style MVC d'origine a été créé pour les interfaces utilisateur qui incluaient plus d'une vue (représentation) du même modèle. Cela fonctionne vraiment bien pour les interfaces utilisateur, mais ne se traduit pas exceptionnellement dans le monde du service Web. Utiliser MVC pour une interface graphique vous permet de voir et de comprendre le pouvoir de ce style.


0 commentaires