我想用以下方法创建一个gui生成器(如NetBeans中的一个):我已经制作了一个JSplitPane
,在左侧我有一个JTextField
,其中我写了一个名称Swing Component
并在右侧我想要显示该组件。事情是这样的:在Java中制作我自己的GUI生成器NetBeans
我想打,使用Reflections
。这是第一次使用它,所以请善待我并解释我如何做到这一点。
谢谢!
我想用以下方法创建一个gui生成器(如NetBeans中的一个):我已经制作了一个JSplitPane
,在左侧我有一个JTextField
,其中我写了一个名称Swing Component
并在右侧我想要显示该组件。事情是这样的:在Java中制作我自己的GUI生成器NetBeans
我想打,使用Reflections
。这是第一次使用它,所以请善待我并解释我如何做到这一点。
谢谢!
在左侧我有一个JTextField,我写Swing组件
井的名字,你真的不应该用一个JTextField。用户不知道什么是有效值。相反,你应该使用JCombobox。然后,您只需从所选项目中获取组件名称
我想使用Reflections进行设置。
创建组件给定一个字符串值可以是这样的基本代码:
try
{
String componentName = "Button";
String classname = "javax.swing.J" + componentName;
JComponent component = (JComponent)Class.forName(classname).newInstance();
// add component to your panel
}
catch(Exception e) { System.out.println(e); }
但是,如果使用上面的代码创建的组件不带任何参数,所以当你添加它到面板它将会非常小。所以你需要额外的代码来设置组件的一些属性。
不是这个代码不是真正的反射,因为你没有检查可能使用的不同构造函数的类。这只是一个简单的方法来创建一个给定字符串名称的对象。
对于使用反射的更灵活的方法,您可以开始指定参数。这是将在创建一个JButton的传递的字符串,例如:
String componentName = "Button";
String classname = "javax.swing.J" + componentName;
Class<?> type = Class.forName(classname);
Class[] argTypes = new Class[]{String.class};
Constructor constructor = type.getConstructor(argTypes);
Object[] parameters = new Object[]{"Button Text"};
JComponent component = (JComponent)constructor.newInstance(parameters);
add(component);
这里是一个更通用的实现作为创建组件,让您创建具有特定参数的组件:
import java.awt.*;
import java.util.*;
import javax.swing.*;
import java.lang.reflect.*;
public class SwingComponentInfo
{
private String name;
private ArrayList<Class> types = new ArrayList<Class>();
private ArrayList<Object> values = new ArrayList<Object>();
public SwingComponentInfo(String name)
{
this.name = name;
}
public SwingComponentInfo(String name, Class type, Object value)
{
this.name = name;
addParameter(type, value);
}
public void addParameter(Class type, Object value)
{
types.add(type);
values.add(value);
}
public String getName()
{
return name;
}
public JComponent createComponent()
{
try
{
String classname = "javax.swing.J" + name;
Class<?> type = Class.forName(classname);
Constructor constructor = type.getConstructor(types.toArray(new Class[types.size()]));
JComponent component = (JComponent)constructor.newInstance(values.toArray());
return component;
}
catch(Exception e) { e.printStackTrace(); }
return null;
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("SwingComponent");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
SwingComponentInfo button = new SwingComponentInfo("Button", String.class, "New Button");
frame.add(button.createComponent());
SwingComponentInfo textField = new SwingComponentInfo("TextField", int.class, 10);
frame.add(textField.createComponent());
SwingComponentInfo textArea = new SwingComponentInfo("TextArea", int.class, 5);
textArea.addParameter(int.class, 30);
frame.add(textArea.createComponent());
frame.setLocationByPlatform(true);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args)
{
EventQueue.invokeLater(() -> createAndShowGUI());
/*
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
*/
}
}
因此,现在您可以将任意数量的SwingComponentInfo
对象添加到组合框。然后在组合框的ActionListener中,选择Item并创建Swing组件,然后将其添加到面板。
当您将SwingComponentInfo
对象添加到组合框以显示组件名称时,您将需要创建自定义渲染器。查看组合框与自定义渲染器的一个简单的方法来做到这一点。
你的问题似乎过于宽泛,因为它涉及到Java的许多子部分。我建议您尝试将问题分解为其组成步骤,然后尝试单独解决每一步。那么如果你遇到困难,你总是可以回来问一个更具体和可回答的问题,并展示你的相关代码。投票结束。 –