java - 在运行时动态创建JTable

标签 java swing reflection jtable runtime

我正在尝试创建jtable使用用户pojo类(class)。用户创建pojo类,我在运行时加载它并创建 jtable 。请帮助我,我怎样才能实现这一目标?

String loadedClass = array.getJSONObject( 0 ).getString( "value" );
Class customFilterClass = new LoaderDynClass( getContext(), pack ).loadClass( loadedClass, true );

customFilterClass - 用户类类型

StringReader reader = new StringReader( filterList );
//customFilterClass extent FilterTableModel. FilterTableModel parent abstract class
List<FilterTableModel> filterTableModelList = objectMapper.readValue( reader, new TypeReference<List<FilterTableModel>>(){} );

我可以用 reflection 来做到这一点API,但不知道如何接收List<UserClass> list 。以及如何指示我的List<???>的类型

很抱歉我的英语))

BGUTable table = (BGUTable) component;

                        ObjectMapper objectMapper = new ObjectMapper(  );
                        objectMapper.disable( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
                        objectMapper.setVisibilityChecker( VisibilityChecker.Std.defaultInstance().withFieldVisibility( JsonAutoDetect.Visibility.ANY));

                        JSONArray array = fieldsJsonObject.optJSONArray( key );
                        String loadedClass = array.getJSONObject( 0 ).getString( "value" );
                        String filterList = array.getJSONObject( 1 ).getString( "value" );

                        Class customFilterClass = null;
                        try
                        {
                            String pack = loadedClass.substring( 0, loadedClass.lastIndexOf( "." ) );
                            customFilterClass = new LoaderDynClass( getContext(), pack ).loadClass( loadedClass, true );
                        }
                        catch( ClassNotFoundException ex )
                        {
                            ClientUtils.showErrorMessageDialog( ex );
                        }
                        StringReader reader = new StringReader( filterList );

                        try
                        {
                            List filterTableModelList = objectMapper.readValue( reader, new TypeReference<List>(){} );
                            Object[] objects = new Object[filterTableModelList.size()];
                            List<Field> fieldsList = new ArrayList<>();
                            for( int x =0; x < objects.length; x++ )
                            {
                                try
                                {
                                    Field[] fields = customFilterClass.getDeclaredFields();
                                    for( int i = 0; i < fields.length; i++ )
                                    {
                                        fieldsList.add( fields[i] );
                                    }

                                    objects[x] = customFilterClass.getDeclaredConstructor( fields[0].getType(), fields[1].getType(), fields[2].getType() ).newInstance( 77,"asdasd", 12 );
                                }
                                catch( InstantiationException e )
                                {
                                    e.printStackTrace();
                                }
                                catch( IllegalAccessException e )
                                {
                                    e.printStackTrace();
                                }
                                catch( InvocationTargetException e )
                                {
                                    e.printStackTrace();
                                }
                                catch( NoSuchMethodException e )
                                {
                                    e.printStackTrace();
                                }
                            }
                            List<FilterTableModel> list = new ArrayList<>();
                            for(int z = 0; z < objects.length; z++)
                            {
                                list.add( (FilterTableModel)objects[z] );
                            }
                            BGTableModel<FilterTableModel> model = new BGTableModel<FilterTableModel>("")
                            {
                                @Override
                                protected void initColumns()
                                {
                                    for( int x = 0; x < fieldsList.size(); x++ )
                                    {
                                        addColumn( fieldsList.get( x ).getName(), fieldsList.get( x ).getType(), false );
                                    }
                                }

                                @Override
                                public Object getValue( FilterTableModel val, int columnId)
                                throws BGException
                                {
                                    FilterTableModel filterTableModel = val;
                                    String data = filterTableModel.getCorrectData( columnId );
                                    if ( data != null )
                                    {
                                        return data;
                                    }
                                    return super.getValue( val, columnId );
                                }
                            };

                            table.setModel( model );
                            model.setData( list );
                        }
                        catch( IOException e )
                        {
                            ClientUtils.showErrorMessageDialog( e );
                        }

这个测试变体,因为我不知道该怎么做

最佳答案

欢迎,

我也遇到了同样的问题。通过使用从 API 获得的 JSON 响应,我使用 jsonschema2pojo 自动创建主类和后续类来映射 POJO 和 BeanTableModel,从而创建自定义 JTable。

使用易于使用的 GSON 库,我只需通过使用 jsonschema2pojo 创建的类传递 API 响应,并提取一个列表,然后迭代该列表,并使用 for() 循环将每个元素添加到 JTable 中,就像这样你做到了。

BeanTableModel:https://tips4java.wordpress.com/2008/11/27/bean-table-model/

检查我的问题:Getting POJO objects into JTable

http://www.jsonschema2pojo.org/

查看https://www.youtube.com/watch?v=ou2yFJ-NWr8 ,Future Studio 有一个关于使用 GSON 从 JSON 中提取 POJO 的丰富教程系列。

关于java - 在运行时动态创建JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59785543/

相关文章:

java - 我的计时器正在执行的方法一直失败

java - 如何在 spring boot 中以编程方式设置 defaultLocale

java - 如何找到主类?入口点?

java - 如何使包含 Jpanel 的 Jframe 可滚动?

java - MethodHandle 可以被框架/库使用(而不是传统的反射)吗?

java - 执行服务: get a list of submitted tasks and cancel all tasks without shutting down the executor

Java JTable 交替行颜色不起作用

java - 如何将一个组合框的数据影响到另一个在 Swing 中两个不同类中可用的组合框的数据?

c# - 如何将程序集引用添加到加载的程序集?

Java 泛型 - 类型转换问题