2. Custom tables - damianfraszczak/swing-dynamic-gui GitHub Wiki

Example of custom generated tables:

SWING LAF Substance LAF
generated table generated table

Defining custom tables

  • Create used model and add @DynamicFormField annotations to some fields/ Let's suppose that we use the same model as for form generation
  • Crate table config, context and table model
 TableConfig tableConfig = new TableConfig(Person.class);
DynamicTableContext tableContext = new DynamicTableContext(
    tableConfig,
    tableConfig.getMetadataProvider().loadMetadata(tableConfig)
);
DynamicFieldTableAdapter tableModel = new DynamicFieldTableAdapter(tableContext);
  • Create table component and show it for example in form. Please remember to do this in EDT
SwingUtils.runInEDT(()->{
            JFrame frame = new JFrame();


            JTable table = new JTable(tableModel);
            table.setDefaultRenderer(Object.class, new DynamicTableContextRenderer(tableContext));
            JScrollPane pane = new JScrollPane(table,
                    JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
            pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
            pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
            frame.add(table.getTableHeader(), BorderLayout.NORTH);
            frame.add(pane, BorderLayout.CENTER);

            frame.setTitle("Dynamic table example");
            frame.pack();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            SwingUtils.centerOnScreen(frame, true);
            frame.setVisible(true);
        });
  • load table data asynchronosuly besides EDT
tableModel.loadData(Arrays.asList(
                Person.builder()
                        .name("John")
                        .surname("Test")
                        .salary(500)
                        .sex(Sex.MALE)
                        .build(),
                Person.builder()
                        .name("Anna")
                        .surname("Swing")
                        .sex(Sex.FEMALE)
                        .salary(500)
                        .build()));