Как сделать невидимыми несколько столбцов в таблице (JTable), не по по порядку - Java

Узнай цену своей работы

Формулировка задачи:

Вот 2 класса. 1-й это фрейм, который отображает таблицу
package com.trainigcenter.carsofrentv3.frames;
 
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.sql.ResultSet;
import java.sql.SQLException;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
 
import com.trainigcenter.carsofrentv3.check.CheckEnterValues;
import com.trainigcenter.carsofrentv3.check.GetAndProcessingOfDate;
import com.trainigcenter.carsofrentv3.dao.DaoСars;
import com.trainigcenter.carsofrentv3.db.DB;
import com.trainigcenter.carsofrentv3.entity.Сars;
 
public class TableFrameCars extends JFrame {
 
    private static final long serialVersionUID = 1L;
    private DB db;
    private int idRole;
    private int idUser;
    private String name;
    private MyJPanel panel,panelCars, panelCostDay;
    private JButton update;
    private JButton choose;
    private JButton orderRegistration;
    private MyTable table, tableCostDay;
    private JScrollPane scroll, scrollCostDay;
    private JTabbedPane tabbed;
 
    public TableFrameCars(DB db, int idRole) throws HeadlessException {
        super();
        this.db = db;
        this.idRole = idRole;
        this.setTitle("База автомобилей.");
        this.setSize(790, 500);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        this.initComponents();
        this.action();
        this.setVisible(true);
    }
 
    public TableFrameCars(DB db, int idUser, String name, int idRole) throws HeadlessException {
        super();
        this.db = db;
        this.idUser = idUser;
        this.name = name;
        this.idRole = idRole;
        this.setTitle("База автомобилей.");
        this.setSize(790, 500);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        this.initComponents();
        this.action();
        this.setVisible(true);
    }
 
    /**
     * Задает ширину для указанного столбца
     * @param index - номер столбца
     * @param width - ширина столбца
     */
    private void setSizeColumnAndRows(int index, int width) {
        TableColumnModel tableColumnModel = table.getColumnModel();
        TableColumn tableColumn = tableColumnModel.getColumn(index);
        tableColumn.setPreferredWidth(width);
    }
 
    private void initComponents() {
        Font font = new Font("Arbat-Bold", Font.PLAIN, 16);
 
        Color yellow = new Color(255, 255, 0);
        Color blue = new Color(0, 0, 255);
 
        update = new JButton("Записать изменения в Базу Данных.");
        update.setFont(font);
        update.setForeground(Color.BLUE);
        update.setBackground(yellow);
        update.setPreferredSize(new Dimension(350, 35));
 
        choose = new JButton("Возврат в окно выбора таблиц.");
        choose.setFont(font);
        choose.setForeground(Color.BLUE);
        choose.setBackground(yellow);
        choose.setPreferredSize(new Dimension(350, 35));
 
        orderRegistration = new JButton("Оформить заказ.");
        orderRegistration.setFont(font);
        orderRegistration.setForeground(Color.YELLOW);
        orderRegistration.setBackground(blue);
        orderRegistration.setPreferredSize(new Dimension(350, 35));
        
        table = new MyTable(db.query("SELECT * FROM cars"));
        table.setRowHeight(25);
        
    /*  TableColumnModel cm = table.getColumnModel();
        cm.removeColumn(cm.getColumn(3));*/

        /*table.removeColumn(table.getColumnModel().getColumn(0));*/

        tableCostDay = new MyTable(db.query("SELECT * FROM costday"));
        tableCostDay.setRowHeight(25);
 
        this.setSizeColumnAndRows(0, 15);
        this.setSizeColumnAndRows(1, 250);
        this.setSizeColumnAndRows(2, 35);
        this.setSizeColumnAndRows(3, 50);
        this.setSizeColumnAndRows(4, 90);
        this.setSizeColumnAndRows(5, 45);
        this.setSizeColumnAndRows(5, 45);
 
        scroll = new JScrollPane(table);
        scroll.setPreferredSize(new Dimension(765, 150));
 
        scrollCostDay = new JScrollPane(tableCostDay);
        scrollCostDay.setPreferredSize(new Dimension(200, 130));

        panel = new MyJPanel();
        panelCars = new MyJPanel();
        panelCars.add(scroll);
        panelCars.add(orderRegistration);
        
        panelCostDay = new MyJPanel();
        panelCostDay.add(update);
        panelCostDay.add(scrollCostDay);
        
        panelCostDay.setBackground(blue);
        
        tabbed = new JTabbedPane();
        tabbed.setPreferredSize(new Dimension(790, 500));
        tabbed.addTab("Выбор машины",  panelCars);
        tabbed.addTab("Стоимость аренды", panelCostDay);
        
        panel.add(tabbed);
        this.add(panel);
    }
    
    /*panel.add(update);
    panel.add(scroll);
    panel.add(orderRegistration);
    panel.add(choose);
    panel.add(scrollCostDay);*/
    
    /**
     * public void mouseEntered(MouseEvent e) - наведение мыши
     * public void mouseExited(MouseEvent e)- нажимание мыши
     */
 
    private void action() {
 
        table.addKeyListener(new KeyAdapter() {
 
            @Override
            public void keyReleased(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_SPACE) {
                    // пишем алгоритм обработки данных по нажатию клавиши Enter или пробел
                }
            }
        });
 
        table.addMouseListener(new MouseListener() {
 
            @Override
            public void mouseClicked(MouseEvent e) {
            }
 
            @Override
            public void mousePressed(MouseEvent e) {
            }
 
            @Override
            public void mouseReleased(MouseEvent e) {
            }
 
            @Override
            public void mouseEntered(MouseEvent e) { 
            }
 
            @Override
            public void mouseExited(MouseEvent e) { 
            }
        });
 
        update.addActionListener(new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent e) {
 
                if (idRole == 1) {
 
                    ResultSet rs = db.query("SELECT * FROM cars");
                    boolean isWriteDataID = false;
                    boolean isWriteDataSpeed = false;
 
                    boolean isWriteYear = false;
                    boolean isWriteFuel = false;
                    boolean isWriteIdCost = false;
                    boolean isIdNotNumber = false;
                    boolean isSelectedRow = false;
 
                    if (CheckEnterValues.checkIsSelectedRow(table.getSelectedRow())) {
                        System.out.println(" Не выделена строка. Запись в Базу данных - не производится");
                    } else {
                        isSelectedRow = true;
 
                        String idCheck = String.valueOf(table.getValueAt(table.getSelectedRow(), 0));
                        String modelCheck = String.valueOf(table.getValueAt(table.getSelectedRow(), 1));
                        String speedCheck = String.valueOf(table.getValueAt(table.getSelectedRow(), 2));
                        String colorCheck = String.valueOf(table.getValueAt(table.getSelectedRow(), 3));
                        String yearCheck = String.valueOf(table.getValueAt(table.getSelectedRow(), 4));
                        String fuelCheck = String.valueOf(table.getValueAt(table.getSelectedRow(), 5));
                        String costCheck = String.valueOf(table.getValueAt(table.getSelectedRow(), 6));
 
                        if (CheckEnterValues.checkIsDigit(idCheck, "id")) {
                            isIdNotNumber = true;
                        }
 
                        if (!isIdNotNumber) {
                            rs = db.query("SELECT * FROM cars WHERE id = " + idCheck);
                            try {
                                if (rs.next()) {
                                    try {
                                        int idSql = 0;
                                        idSql = rs.getInt("id");
                                        System.out.println("idSql = " + idSql);
                                    } catch (SQLException e1) {
                                        e1.printStackTrace();
                                    }
                                }
                            } catch (SQLException e1) {
                                e1.printStackTrace();
                            }
                            isWriteDataID = true;
                        } else {
                            isWriteDataID = false;
                        }
 
                        if (!CheckEnterValues.checkIsDigit(speedCheck, "speed")) {
                            int speedCheckInt = Integer.valueOf(speedCheck);
                            if (speedCheckInt < 200 || speedCheckInt > 400) {
                                System.out.println("проверка на достоверноое значение скорости\n");
                                isWriteDataSpeed = false;
                                String message1 = " В поле 'speed' нельзя занести данное значение.\n"
                                        + " Спорткар не может развить такую скорость";
                                String message2 = "Поля таблицы.";
                                JOptionPane.showMessageDialog(panel, message1, message2,
                                        JOptionPane.INFORMATION_MESSAGE);
                            } else {
                                isWriteDataSpeed = true;
                            }
                        } else {
                            isWriteDataSpeed = false;
                            System.out.println("id - введены не цифры");
                        }
 
                        if (!CheckEnterValues.checkIsDigit(yearCheck, "year_manufacture")) {
                            int yearCheckInt = Integer.valueOf(yearCheck);
                            if (yearCheckInt < 1950 || yearCheckInt > 2019) {
                                System.out.println("проверка на достоверное значение года выпуска\n");
                                isWriteYear = false;
                                String message1 = " В поле 'year_manufacture' нельзя занести данное значение.\n"
                                        + " Спорткары в данный период времени еще не выпускались";
                                String message2 = "Поля таблицы.";
                                JOptionPane.showMessageDialog(panel, message1, message2,
                                        JOptionPane.INFORMATION_MESSAGE);
                            } else {
                                isWriteYear = true;
                            }
                        } else {
                            isWriteYear = false;
                            System.out.println("id - введены не цифры");
                        }
 
                        if (!CheckEnterValues.checkIsDigit(fuelCheck, "fuel_flow")) {
                            int fuelCheckInt = Integer.valueOf(fuelCheck);
                            if (fuelCheckInt < 1 || fuelCheckInt > 14) {
                                System.out.println("проверка на достоверное значение года выпуска\n");
                                isWriteFuel = false;
                                String message1 = " В поле 'fuel_flow' нельзя занести данное значение.\n"
                                        + " Спорткары c таким расходом топлива - не исправны";
                                String message2 = "Поля таблицы.";
                                JOptionPane.showMessageDialog(panel, message1, message2,
                                        JOptionPane.INFORMATION_MESSAGE);
                            } else {
                                isWriteFuel = true;
                            }
                        } else {
                            isWriteFuel = false;
                            System.out.println("id - введены не цифры");
                        }
 
                        int idLastTable = 0;
                        if (tableCostDay.getRowCount() == 0) {
                            idLastTable = 0;
                        } else {
                            idLastTable = Integer
                                    .valueOf((tableCostDay.getValueAt(table.getRowCount() - 1, 0).toString()));
                        }
 
                        if (!CheckEnterValues.checkIsDigit(costCheck, "id_cost_day")) {
                            int costCheckInt = Integer.valueOf(costCheck);
                            if (costCheckInt < 1 || costCheckInt > idLastTable) {
                                System.out.println("проверка на достоверное значение идентификатора таблицы\n");
                                isWriteIdCost = false;
                                String message1 = " В поле 'id_cost_day' нельзя занести данное значение.\n"
                                        + " Разрешены :\n" + " 1, 2, 3, 4";
                                String message2 = "Поля таблицы.";
                                JOptionPane.showMessageDialog(panel, message1, message2,
                                        JOptionPane.INFORMATION_MESSAGE);
                            } else {
                                isWriteIdCost = true;
                            }
                        } else {
                            isWriteIdCost = false;
                            System.out.println("id - введены не цифры");
                        }
 
                        if (isWriteDataID && isWriteDataSpeed && isWriteYear && isWriteFuel && isWriteIdCost
                                && isSelectedRow) {
 
                            Integer id = Integer.valueOf(idCheck);
                            String model = modelCheck;
                            System.out.println("model = " + model);
                            Integer speed = Integer.valueOf(speedCheck);
                            System.out.println("speed = " + speed);
                            String color = colorCheck;
                            System.out.println("color = " + color);
                            Integer year = Integer.valueOf(yearCheck);
                            System.out.println("year = " + year);
                            Integer fuel = Integer.valueOf(fuelCheck);
                            System.out.println("fuel = " + fuel);
                            Integer cost = Integer.valueOf(costCheck);
                            System.out.println("cost = " + cost);
 
                            DaoСars daoCars = new DaoСars(db);
                            Сars cars = new Сars(id, model, speed, color, year, fuel, cost);
                            daoCars.update(cars);
                            System.out.println("Изменения записаны");
                        }
                    }
                } else if (idRole == 2) {
                    String message1 = " Вам запрещено редактировать данную таблицу.";
                    String message2 = "Уровень доступа.";
                    JOptionPane.showMessageDialog(panel, message1, message2, JOptionPane.WARNING_MESSAGE);
                }
            }
 
        });
 
        choose.addActionListener(new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent arg0) {
 
                if (!GetAndProcessingOfDate.getValidate(idRole)) {
                    new TablesFrame(db);
                    dispose();
                    System.out.println("Переход в TablesFrame ");
                }
            }
        });
 
        orderRegistration.addActionListener(new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent arg0) {
                new ChooseOfProductsFrame(db, idUser, name, idRole);
                dispose();
                System.out.println("Переход в ChooseOfProductsFrame");
            }
        });
 
    }
}
2-й класс, создает модель таблицы по умолчанию.
package com.trainigcenter.carsofrentv3.frames;
 
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Vector;
 
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
 
/**
 * Создание модели таблиц
 * 
 * @DefaultTableModel defaultModel - создаем модель таблицы по умолчанию
 * @ResultSetMetaData rsmd; - хранение служебной информации о таблице for (int i
 *                    = 1; i <= rsmd.getColumnCount(); i++) - этот цикл,
 *                    обрабатывает таблицу, получая имена полей(столбцов) данной
 *                    таблицы addColumn() - это метод добавлет в модель таблицы,
 *                    только шапку таблицы while 
 *                 
 * @(rs.next()) { - запускаем
 *                    цикл, который обрабатывает столбцы текущей строки в
 *                    таблице Vector  v - создаем коллекцию класса
 *                    Vector v.add(rs.getString(i)) - обрабатываем полученную
 *                    строку и затем, значение каждого столбца помещаем в свою
 *                    позицию текущей строки обрабатываемой таблицы
 *                    defaultModel.addRow(v) - добавление строку в модель
 *                    таблицы ( модель по умолчанию) После того, как цикл while
 *                    пройдет всю обрабатываемую таблицу и модель таблицы будет
 *                    заполнена, она с помощью метода setModel, регистрируется и
 *                    далее этот объект можно помещать во нужный фрейм. @ @
 *                    this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); -
 *                    позволяет растягивать столбцы вручную
 * @setAutoResizeMode(AUTO_RESIZE_ALL_COLUMNS); - автоматическая подстройка ширины столбца
 * в зависимости от  ширины названия поля   
 * public boolean isCellEditable(int row, int column) - запрет на редактиорование 1-го стольбца в таблице           
 * @ @author IT
 *
 */
public class MyTable extends JTable {
 
    private static final long serialVersionUID = 1L;
 
    public MyTable(ResultSet rs) {
        super();
        DefaultTableModel defaultModel = new DefaultTableModel();
        ResultSetMetaData rsmd;
        try {
            rsmd = rs.getMetaData();
            for (int i = 1; i <= rsmd.getColumnCount(); i++) {
                defaultModel.addColumn(rsmd.getColumnName(i));
            }
            while (rs.next()) {
                Vector v = new Vector();
                for (int i = 1; i <= rsmd.getColumnCount(); i++) {
                    v.add(rs.getString(i));
                }
                defaultModel.addRow(v);
            }
            this.setModel(defaultModel);
              setAutoCreateColumnsFromModel(false);
            setAutoResizeMode(AUTO_RESIZE_ALL_COLUMNS);
        } catch (SQLException ex) {
            System.out.println(" Ошибка в классе MyTable " + ex);
        }
    }
 
    @Override
    public boolean isCellEditable(int row, int column) {
        
        if(column == 0) {
            return false;
        }
        return true;
    }

}
Знаю как скрыть 1 столбец.
TableColumnModel cm = table.getColumnModel();
        cm.removeColumn(cm.getColumn(3))
или так
table.removeColumn(table.getColumnModel().getColumn(0));
Но мне необходимо чтобы: 1. Столбцы могут идти не по порядку и их нужно скрыть. 2. Столбцы которые невидимы пользователю, все равно должны участвовать в вычислениях. То есть они должны поступить в дефолтную модель таблицы, но не должны отображаться во фрейме. Есть ли решение чтобы не писать заново какой-то класс, чтобы из него потом доставать метод, позволяющий скрывать столбцы? Насколько возможно простое решение покажите пожалуйста?

Решение задачи: «Как сделать невидимыми несколько столбцов в таблице (JTable), не по по порядку»

textual
Листинг программы
package com.trainigcenter.carsofrentv3.frames;
 
import java.awt.Dimension;
import java.awt.HeadlessException;
 
import com.trainigcenter.carsofrentv3.db.DB;
import static com.trainigcenter.carsofrentv3.check.GetAndProcessingOfDate.*;
 
/**
 * Класс наследуется от класса, который делает заготовку фрейма
 * @getValidateUser() - проверяются права доступа
 * @author it
 *
 */
public class TableFrameOrders extends Frames {
 
    private static final long serialVersionUID = 1L;
 
    public TableFrameOrders(DB db, int idRole, String name, int idUser) throws HeadlessException {
        super(db, idRole, idUser, name);
        if(getValidateUser(idRole)) {
            this.setTitle("Ваши Заказы.");
            setSize(1100, 250);
        } else {
            this.setTitle("Заказы.");   
        }
        
    }
 
    @Override
    protected void setSizeColumnAndRows(int index, int width) {
        super.setSizeColumnAndRows(index, width);
    }
 
    /**
     * @getValidateUser(idRole) - если вход осущетствлен под правами пользователя, 
     * показывается таблица с укороченным вариантом.
     * Цикл for и оператор switch - скрывают выборочно указанные столбцы.
     */
    @Override
    protected void initComponents() {
 
        this.table = new MyTable(db.query("SELECT * FROM orders WHERE id_client = " + super.idUser ));
        this.table.setRowHeight(25);
        
        if(getValidateUser(idRole)) {
            for(int i = 0; i < this.table.getColumnModel().getColumnCount(); ) {
                
                switch (i) {
                case 0:
                    super.table.getColumnModel().getColumn(i).setMinWidth(0);
                    super.table.getColumnModel().getColumn(i).setMaxWidth(0);
                    i = 1;
                    System.out.println("+++++++++ i = "  + i);
                    break;
                case 1:
                    super.table.getColumnModel().getColumn(i).setMinWidth(0);
                    super.table.getColumnModel().getColumn(i).setMaxWidth(0);
                    i = 2;
                    System.out.println("+++++++++ i = "  + i);
                    break;
                case 2:
                    super.table.getColumnModel().getColumn(i).setMinWidth(0);
                    super.table.getColumnModel().getColumn(i).setMaxWidth(0);
                    i = 6;
                    System.out.println("+++++++++ i = "  + i);
                    break;
                case 6: 
                    super.table.getColumnModel().getColumn(i).setMinWidth(0);
                    super.table.getColumnModel().getColumn(i).setMaxWidth(0);
                    System.out.println("+++++++++ i = "  + i);
                    i = 7;
                    break;
                case 7: 
                    super.table.getColumnModel().getColumn(i).setMinWidth(0);
                    super.table.getColumnModel().getColumn(i).setMaxWidth(0);
                    System.out.println("+++++++++ i = "  + i);
                    i = 8;
                    break;  
                case 8: 
                    super.table.getColumnModel().getColumn(i).setMinWidth(0);
                    super.table.getColumnModel().getColumn(i).setMaxWidth(0);
                    System.out.println("+++++++++ i = "  + i);
                    i = 9;
                    break;
                case 9: 
                    super.table.getColumnModel().getColumn(i).setMinWidth(0);
                    super.table.getColumnModel().getColumn(i).setMaxWidth(0);
                    System.out.println("+++++++++ i = "  + i);
                    i = 10;
                    break;
                case 10:    
                    super.table.getColumnModel().getColumn(i).setMinWidth(0);
                    super.table.getColumnModel().getColumn(i).setMaxWidth(0);
                    System.out.println("+++++++++ i = "  + i);
                    i = 12;
                    break;  
                }   
            }
 
            this.setSizeColumnAndRows(3, 60);
            this.setSizeColumnAndRows(4, 90);
            this.setSizeColumnAndRows(5, 90);
            this.setSizeColumnAndRows(11, 810);
            
            super.initComponents(); 
            this.scroll.setPreferredSize(new Dimension(1070, 207));
            this.panel.add(super.scroll);
            this.add(super.panel);
            
        } else {
            System.out.println(" Работает администратор.");
            this.setSizeColumnAndRows(0, 25);
            this.setSizeColumnAndRows(1, 12);
            this.setSizeColumnAndRows(2, 10);
            this.setSizeColumnAndRows(3, 60);
            this.setSizeColumnAndRows(4, 90);
            this.setSizeColumnAndRows(5, 70);
            this.setSizeColumnAndRows(6, 25);
            this.setSizeColumnAndRows(7, 35);
            this.setSizeColumnAndRows(8, 35);
            this.setSizeColumnAndRows(9, 25);
            this.setSizeColumnAndRows(10, 25);
            this.setSizeColumnAndRows(11, 250);
        }
            
    }
 
    @Override
    protected void action() {
        super.action();
    }
 
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы