Создание нескольких таблиц JTable по нажатию одной кнопки

250
18 апреля 2018, 09:14

Добрый день! Подскажите, пожалуйста, в моей программе есть кнопка, по нажатию которой создается таблица (JTable) во вкладке, вкладке присваивается имя из JTextField. Если нажать на кнопку еще раз, то можно создать еще одну таблицу в другой вкладке. Также есть кнопка удаления выделенной строки, но удалить не получается, т.к. таблицу программа не обнаруживает, поскольку новый экземпляр таблицы создается внутри первой кнопки и не является public. Если создать новый экземпляр таблицы не внутри кнопки создания таблицы, а сделать это в теле общего класса, то такая таблица будет public, но, в этом случае, по нажатию кнопки добавить таблицу первая становится пустой. Как можно генерировать public экземпляры таблиц по нажатию одной кнопки, чтобы потом по нажатию другой можно было удалять выделенный строки из активной вкладки (таблицы)?

Вот мой код кнопки добавить таблицу:

private void bt_AddActionPerformed(java.awt.event.ActionEvent evt) {                                       
GlobalVars.firmAdd = tf_addFirm.getText();
DefaultTableModel tableModel = new DefaultTableModel();
JTable table = new JTable(tableModel);
tableModel.setDataVector(new Object [][] {}, new String [] {"№", "Дата заказа", "Дата статуса", "Наименование детали", "Оборудование", "Ссылка для фото", "Кол-во", "Номер заказа", "Стоимость", "Срок поставки", "Согласовано", "В обработке", "Сбор заказа", "Заказано"});
if (table.getColumnModel().getColumnCount() > 0) {
        table.getColumnModel().getColumn(0).setMinWidth(40);
        table.getColumnModel().getColumn(0).setPreferredWidth(40);
        table.getColumnModel().getColumn(0).setMaxWidth(40);
        table.getColumnModel().getColumn(1).setMinWidth(80);
        table.getColumnModel().getColumn(1).setPreferredWidth(80);
        table.getColumnModel().getColumn(1).setMaxWidth(80);
        table.getColumnModel().getColumn(2).setMinWidth(85);
        table.getColumnModel().getColumn(2).setPreferredWidth(85);
        table.getColumnModel().getColumn(2).setMaxWidth(85);
        table.getColumnModel().getColumn(3).setMinWidth(300);
        table.getColumnModel().getColumn(3).setPreferredWidth(300);
        table.getColumnModel().getColumn(3).setMaxWidth(300);
        table.getColumnModel().getColumn(4).setMinWidth(300);
        table.getColumnModel().getColumn(4).setPreferredWidth(300);
        table.getColumnModel().getColumn(4).setMaxWidth(300);
        table.getColumnModel().getColumn(5).setMinWidth(200);
        table.getColumnModel().getColumn(5).setPreferredWidth(200);
        table.getColumnModel().getColumn(5).setMaxWidth(200);
        table.getColumnModel().getColumn(6).setMinWidth(50);
        table.getColumnModel().getColumn(6).setPreferredWidth(50);
        table.getColumnModel().getColumn(6).setMaxWidth(50);
        table.getColumnModel().getColumn(7).setMinWidth(150);
        table.getColumnModel().getColumn(7).setPreferredWidth(150);
        table.getColumnModel().getColumn(7).setMaxWidth(150);
        table.getColumnModel().getColumn(9).setMinWidth(95);
        table.getColumnModel().getColumn(9).setPreferredWidth(95);
        table.getColumnModel().getColumn(9).setMaxWidth(95);
        table.getColumnModel().getColumn(10).setMinWidth(85);
        table.getColumnModel().getColumn(10).setPreferredWidth(85);
        table.getColumnModel().getColumn(10).setMaxWidth(85);
        table.getColumnModel().getColumn(11).setMinWidth(85);
        table.getColumnModel().getColumn(11).setPreferredWidth(85);
        table.getColumnModel().getColumn(11).setMaxWidth(85);
        table.getColumnModel().getColumn(12).setMinWidth(85);
        table.getColumnModel().getColumn(12).setPreferredWidth(85);
        table.getColumnModel().getColumn(12).setMaxWidth(85);
        table.getColumnModel().getColumn(13).setMinWidth(65);
        table.getColumnModel().getColumn(13).setPreferredWidth(65);
        table.getColumnModel().getColumn(13).setMaxWidth(65);
        table.setShowHorizontalLines(true);
        table.setShowVerticalLines(true);
    }
tb_tabbedPane.addTab(GlobalVars.firmAdd, new JScrollPane(table));

}

Answer 1

Попробуйте декопозировать ваш код, а именно выделите объекты таблица и кнопка в отдельную панель и добавляйте ее, таким образом вы всегда спросив у панели ее таблицу, получите именно таблицу с нужной Вам панели и сделаете что необходимо.

Для примера накидал код, который создает новые панели во вкладках, а при нажатии на кнопку на панели отображается название панели, собственно вы можете сделать обращение к таблице и удаление строки.

    import javax.swing.*;
    import java.awt.*;
    import java.util.Random;
    public class TableTest {
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> {
                JFrame frame = new JFrame();
                JTextField textField = new JTextField();
                JTabbedPane tabbedPane = new JTabbedPane();
                frame.add(tabbedPane, BorderLayout.CENTER);
                JButton button = new JButton("Добавить");
                button.addActionListener(e -> tabbedPane.add(textField.getText(), new OwnPanel(textField.getText())));
                frame.add(textField, BorderLayout.NORTH);
                frame.add(tabbedPane, BorderLayout.CENTER);
                frame.add(button, BorderLayout.SOUTH);
                frame.setSize(500, 500);
                frame.setLocationRelativeTo(null);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            });
        }
    }
    class OwnPanel extends JPanel {
        private JLabel label;
        private JTable table;
        private JButton button;
        public OwnPanel(String name) {
            setLayout(new BorderLayout());
            label = new JLabel(name);
            int rndColumn = new Random().nextInt(10);
            Object[] columns = new Object[rndColumn];
            for (int i = 0; i < rndColumn; i++) {
                columns[i] = i;
            }
            int rndrow = new Random().nextInt(20);
            Object[][] rows = new Object[rndrow][rndColumn];
            for (int i = 0; i < rndrow; i++) {
                for (int c = 0; c < rndColumn; c++) {
                    rows[i][c] = c;
                }
            }
            table = new JTable(rows, columns);
            button = new JButton("Нажми меня");
            button.addActionListener(e -> JOptionPane.showMessageDialog(table, label.getText()));
            add(label, BorderLayout.NORTH);
            add(table, BorderLayout.CENTER);
            add(button, BorderLayout.SOUTH);
        }
    }
READ ALSO
Поочередный вызов сервисов из одного docker-compose файла

Поочередный вызов сервисов из одного docker-compose файла

Подскажите пожалуйста, у меня имеется один docker-compose файлВ нём есть 2 тестовых сервиса и 2 рабочих

247
Как создать динамический массив fragment -ов?

Как создать динамический массив fragment -ов?

Делаю Navigation drawer внутри него RecyclerView необходимо по клику по item-y RcyclerView открывать новый фрагмент

197
Spring MVC Передать данные в другой контроллер

Spring MVC Передать данные в другой контроллер

Есть часть кода в UserController, которая обрабатывает данные из формы:

205
Rest API - Internal Server Error

Rest API - Internal Server Error

Веб-сервис был разработан в среде IntelliJ IDEA на win7Использовался сервер GlassFish 4

209