Существует ли lib, который может создать простой GUI путем рассмотрения класса или сигнатуры метода?
Например:
class MyMath{
public static double sqrt(double d){
//impl
}
}
Кому:
Так, чтобы, когда кнопка нажата, метод был вызван, и результат показывают.
Вы знаете какие-либо примеры чего-то как этот в Java или других языках?
спасибо
Я написал очень простой пример, который показывает, как этого можно достичь, используя код отражения в несколько строк и небольшое колебание. Может быть, 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();
}
}
На самом деле существует в виде расширений управления Java или JMX . Но это очень тяжелый молоток для примера, который вы здесь приводите. Но он предоставляет методы и свойства стандартным образом, и вы можете получить к ним доступ с помощью таких инструментов, как веб-интерфейсы, JConsole, удаленный вызов процедур и т. Д.
Он используется для инструментирования и управления серверами приложений и т.п.
Я не знаю о существовании такой библиотеки, но вам будет довольно легко ее создать - предположим, вам просто нужно текстовое поле для каждого аргумента, кнопка для выполнения метода с выбранным аргументом и метка/поле для отображения результата. Нечто подобное можно получить с помощью JPanel, используя FlowLayout и немного магии отражения.
Если вы знаете или хотите попробовать язык groovy, то создать такой gui будет очень просто. Вы просто объедините SwingBuilder для настоящего GUI с Groovy's MetaClass для открытия методов вашего класса. Вы также можете использовать преимущества консоли groovy для добавления некоторых динамических функций.
Если вы готовы писать свой код как JavaBeans, может быть доступно несколько легких инструментов тестирования. В спецификации JavaBeans гораздо больше, чем геттеры и сеттеры.
BeanBox, похоже, исчез из JDK с момента моего последнего использования (в 1997 году), но посмотрите в разделе Related Links > Products and Technologies этой ссылки.