我正在为我的学生制作一个图书馆,以便用Java创建一个简单的GUI, 但如果他们按下界面中的按钮,它应该运行由他们创建的方法 有没有办法做到这一点? 我不是真正的Java,但课程要我:(
答案 0 :(得分:0)
您可以使用反射来运行它们的类,而不需要它们实现接口,尽管您仍然必须提供限制参数类型的指令。这仅适用于没有参数的方法。
java.awt.EventQueue.invokeLater(() -> {
JFrame frm = new JFrame();
JPanel pnl = new JPanel();
frm.add(pnl);
pnl.setLayout(new BoxLayout(pnl, BoxLayout.Y_AXIS));
pnl.add(new JLabel("Class"));
JTextField classField = new JTextField();
pnl.add(classField);
pnl.add(new JLabel("Method"));
JTextField methodField = new JTextField();
pnl.add(methodField);
JTextArea area = new JTextArea();
area.setPreferredSize(new Dimension(300, 300));
JButton btn = new JButton("Run");
pnl.add(btn);
pnl.add(area);
System.setOut(new PrintStream(new OutputStream() {
@Override
public void write(int b) throws IOException {
area.append(new String(new byte[]{(byte) b}));
}
}));
btn.addActionListener(e -> {
try {
Class cls = Class.forName(classField.getText());
Method m = null;
Method ma[] = cls.getDeclaredMethods();
String methodName = methodField.getText().trim();
m = cls.getMethod(methodName,new Class[]{});
Object o = cls.newInstance();
Object mr = m.invoke(o);
if(null != mr) {
area.append("\nreturned "+mr.toString()+"\n");
}
} catch (Exception ex) {
ex.printStackTrace();
area.append("\nException "+ex.getMessage()+"\n");
}
});
frm.pack();
frm.setVisible(true);
});
给出一个类:
public class StudentClass {
public void print10() {
int sum= 0;
for(int i = 0; i< 10; i++ ) {
System.out.println("i = "+i);
sum+=i;
}
}
}
字段需要填充StudentClass
和print10
,编译的类需要在您的类路径上。
也许更好的选择是教授处理(https://processing.org/)。这本质上是java,因为Processing代码会在幕后粘贴到一个java类中,但它更倾向于让初学者绘制图形草图。我想你不得不问你的管理部门是否愿意,并且在某些时候学生需要能够编写处理工具为他们生成的代码。