6
votes

GUI de la définition de la classe

Y a-t-il une lib qui peut construire une interface graphique simple en regardant une classe ou une signature de méthode?

Par exemple: xxx

à interface graphique

de sorte que lorsque le bouton est cliqué sur lequel la méthode est appelée et le résultat est affiché.

Connaissez-vous des exemples de quelque chose comme ça en Java ou dans d'autres langues?

Merci


1 commentaires

Je ne connais pas d'une bibliothèque, mais j'ai certainement écrit la logique pour faire cela seul. Ce n'est pas vraiment si difficile, surtout avec quelque chose comme de .net flowlayOutPanel .


7 Réponses :




0
votes

Si vous savez ou que vous voulez essayer le Groovy Langue, il serait très facile de construire de tels une interface graphique. Vous allez simplement combiner le swingbuilder pour l'interface graphique avec la métaclasse de Groovy pour découvrir les méthodes de votre classe. Vous pouvez également profiter de la console Groovy pour ajouter des caractéristiques dynamiques.


2 commentaires

Après avoir examiné rapidement Groovy, je ne vois pas exactement quelles fonctionnalités me bénéficieraient. Serait-il différent de l'utilisation de la réflexion pour regarder une classe et construire l'interface graphique en conséquence?


Vous pouvez bien sûr implémenter votre application également sans Groovy. Je l'ai recommandé parce que les deux tâches (écrire une graphique simple et l'utilisation de la réflexion) sont grandement simplifiées à l'aide de la langue groovy. Le choix a été fait en raison de l'hypothèse que vous n'êtes pas contraint par une base de code existante.




1
votes

J'ai codé un exemple très basique, ce qui montre comment cela peut être réalisé en utilisant quelques lignes de code de réflexion et peu de balançoire. Peut-être init () devrait renvoyer le nombre de méthodes trouvées pour une utilisation dans le gridlaouout, il serait alors plus dynamique.

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Method;
import java.util.HashMap;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class MathPanel extends JFrame {

    public static double sqrt(double d) {
        return Math.sqrt(d);
    }

    public static double sin(double d) {
        return Math.sin(d);
    }

    public static double cos(double d) {
        return Math.cos(d);
    }

    class Item implements ActionListener {
        JTextField result = new JTextField();
        JTextField param = new JTextField();
        JButton button;
        Method m;
        public Item(JFrame frame,String name, Method m) {
            button = new JButton(name);
            button.addActionListener(this);
            this.m = m;
            frame.getContentPane().add(param);
            frame.getContentPane().add(button);
            frame.getContentPane().add(result);
        }

        public void actionPerformed(ActionEvent e) {
            String cmd  = e.getActionCommand();
            Item item = map.get(cmd);
            try {
                double dbl = Double.parseDouble(item.param.getText());
                Object invoke = item.m.invoke(this, dbl);
                item.result.setText("" + invoke );
            } 
            catch (Exception x) {
                x.printStackTrace();
            }
        }
    }

    HashMap<String,Item>map = new HashMap<String, Item>(); 


    public MathPanel() {
        setLayout(new GridLayout(3,3));
        setTitle("Test");
        setSize(400, 100);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    private void init() {
        try {
            Method[] allMethods = MathPanel.class.getDeclaredMethods();
            for (Method m : allMethods) {
                String mname = m.getName();
                Class<?> returnType = m.getReturnType();
                if ( returnType.getName().equals("double")) {
                    Item item = new Item(this,mname,m);
                    map.put(mname,item);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        MathPanel mp = new MathPanel();
        mp.init();
    }
}


1 commentaires

C'est une sorte de ce que je voulais dire. Bien sûr, c'est plus une preuve de concept qu'une bibliothèque. Je pense que le concept pourrait être étendu pour gérer beaucoup de cas. Cette question a été arrondie longtemps, alors je suppose que la bibliothèque que je cherchais n'a pas encore été construite.



1
votes

J'ai écrit ma thèse de diplôme sur exactement ce sujet. Nous l'utilisons à l'université comme UI pour notre logiciel de simulation. Et nous y travaillons toujours (dans le cadre de ma thèse de doctorat). Il est prévu de le libérer comme projet open source cette année. Bien que optimisé pour le domaine de la simulation technique, il peut également être utilisé dans d'autres domaines. Si vous êtes intéressé, consultez VRL-Introduction < / p>


0 commentaires

1
votes

Il y a le bibliothèque de réflectionU qui semble faire exactement ce que vous voulez:

new ReflectionUI().openObjectFrame(new MyMath(), null, null);


0 commentaires