2016-04-30 67 views
0

我想用以下方法创建一个gui生成器(如NetBeans中的一个):我已经制作了一个JSplitPane,在左侧我有一个JTextField,其中我写了一个名称Swing Component并在右侧我想要显示该组件。事情是这样的:在Java中制作我自己的GUI生成器NetBeans

http://i.stack.imgur.com/2KUYs.png

我想打,使用Reflections。这是第一次使用它,所以请善待我并解释我如何做到这一点。

谢谢!

+2

你的问题似乎过于宽泛,因为它涉及到Java的许多子部分。我建议您尝试将问题分解为其组成步骤,然后尝试单独解决每一步。那么如果你遇到困难,你总是可以回来问一个更具体和可回答的问题,并展示你的相关代码。投票结束。 –

回答

2
在左侧

我有一个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对象添加到组合框以显示组件名称时,您将需要创建自定义渲染器。查看组合框与自定义渲染器的一个简单的方法来做到这一点。