GUI из определения класса - PullRequest
6 голосов
/ 21 июня 2010

Существует ли библиотека, которая может создать простой графический интерфейс, взглянув на сигнатуру класса или метода?

Например:

class MyMath{
    public static double sqrt(double d){
         //impl
    }
}       

К

gui

Чтобы при нажатии кнопки вызывался метод и отображался результат.

Вам известны примеры чего-то подобного в Java или других языках?

спасибо

Ответы [ 7 ]

1 голос
/ 10 апреля 2011

Я написал дипломную работу именно по этой теме. Мы используем его в университете как интерфейс для нашего программного обеспечения для моделирования. И мы все еще работаем над этим (как часть моей докторской диссертации). В этом году планируется выпустить его как проект с открытым исходным кодом. Хотя он оптимизирован для области технического моделирования, его можно использовать и в других областях. Если вам интересно, взгляните на VRL-Введение

1 голос
/ 03 марта 2015

Существует библиотека ReflectionUI , которая, кажется, выполняет именно то, что вам нужно:

new ReflectionUI().openObjectFrame(new MyMath(), null, null);
1 голос
/ 21 июня 2010

Я написал очень простой пример, который показывает, как этого можно достичь, используя код отражения в несколько строк и небольшое колебание.Возможно, init () должен вернуть количество методов, найденных для использования в GridLayout, тогда он будет более динамичным.

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 голос
/ 21 июня 2010

Я не знаю о существовании такой библиотеки, но вам будет довольно легко ее создать - предположим, вы просто хотите получить текстовое поле для каждого аргумента, кнопку для запуска метода с выбраннойаргумент и метка / поле для отображения результата.Нечто подобное можно сделать с помощью JPanel, используя FlowLayout и немного магии отражения.

1 голос
/ 21 июня 2010

На самом деле существует в виде Java Management Extensions или JMX .Но это очень тяжелый молот для примера, который вы приводите здесь.Но он предоставляет методы и свойства стандартным способом, и вы можете получить к ним доступ с помощью таких инструментов, как веб-интерфейсы, JConsole, удаленный вызов процедур и т. Д.

Он используется для инструментов и управления серверами приложений и т.п.

0 голосов
/ 21 июня 2010

Если вы хотите написать свой код как JavaBeans , возможно, имеется несколько легких инструментов для тестирования. В спецификации JavaBeans есть гораздо больше, чем в методах получения и установки.

BeanBox , похоже, исчез из JDK с тех пор, как я в последний раз использовал его (в 1997 году), но посмотрите в разделе Ссылки по теме> Продукты и технологии этой ссылки .

0 голосов
/ 21 июня 2010

Если вы знаете или хотите попробовать язык groovy , было бы очень легко создать такой графический интерфейс.Вы просто объединили бы SwingBuilder для реального графического интерфейса с MetaClass Groovy, чтобы обнаружить методы вашего класса.Вы также можете воспользоваться превосходной консолью, чтобы добавить некоторые динамические функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...