是否有可以通过查看类或方法签名来构建简单GUI的库?
例如:
class MyMath{
public static double sqrt(double d){
//impl
}
}
到
因此,当单击该按钮时,将调用该方法并显示结果。
您是否知道Java或其他语言中的任何示例?
感谢
答案 0 :(得分:1)
实际上有Java Management Extensions or JMX的形式。但对于你在这里给出的那种例子,这是一个非常重的锤子。但它以标准方式公开方法和属性,您可以使用Web界面,JConsole,远程过程调用等工具来访问它们。
它用于检测和管理应用程序服务器等。
答案 1 :(得分:1)
我不知道这样一个库的存在,但你可以很容易地创建一个 - 假设你只需要为每个参数创建一个文本字段,一个按钮来执行所选择的方法参数和标签/字段以显示结果。使用FlowLayout的JPanel和一些反射魔法可以实现这样的事情。
答案 2 :(得分:1)
我编写了一个非常基本的例子,它展示了如何使用几行反射代码和小摆动来实现这一点。也许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();
}
}
答案 3 :(得分:1)
我写了关于这个主题的文凭论文。我们在大学使用它作为我们的模拟软件的UI。我们仍在努力(作为我的博士论文的一部分)。计划今年将其作为开源项目发布。虽然针对技术模拟领域进行了优化,但它也可以用于其他领域。如果您有兴趣,请查看VRL-Introduction
答案 4 :(得分:1)
ReflectionUI库似乎完全符合您的要求:
new ReflectionUI().openObjectFrame(new MyMath(), null, null);
答案 5 :(得分:0)
如果您碰巧知道或想要尝试使用groovy语言,那么构建这样的gui非常容易。您只需将实际GUI的SwingBuilder与Groovy的MetaClass结合起来,就可以发现您的类的方法。 您还可以利用groovy控制台添加一些动态功能。
答案 6 :(得分:0)