Jcheckbox внутри столбца в JTable

Я хочу создать таблицу, в которой каждый раз, когда добавляется новая строка, также будет добавлен новый флажок в определенном столбце. Я провел свое исследование, но до сих пор не могу найти правильный ответ на свой вопрос, и иногда мне трудно понять некоторые инструкции, так что вот моя проблема:

Я добавил флажок внутри столбца («e») моей таблицы, но он не отображается. Флажок отображается, только если я нажму на него.

package app.ui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Font;
import java.awt.event.KeyEvent;
import java.util.List;

import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;
import javax.swing.DefaultCellEditor;
import javax.swing.JTextField;
import javax.swing.JCheckBox;
import javax.swing.SwingConstants;

import app.dao.item.impl.ReadItemFromDB;
import app.model.Item;

public class Inventory {

private JFrame inventoryframe;
private JTable table;
private JTextField textField;
private JCheckBox checkbox;
/**
 * Launch the application.
 */
public  void InventoryWindow() {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Inventory window = new Inventory();
                window.inventoryframe.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public Inventory() {
    initialize();

}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    inventoryframe = new JFrame();
    inventoryframe.setExtendedState(JFrame.MAXIMIZED_BOTH);
    inventoryframe.getContentPane().setBackground(new Color(153, 204, 102));
    inventoryframe.getContentPane().setForeground(new Color(255, 255, 255));
    inventoryframe.getContentPane().setPreferredSize(new Dimension(1365, 747));
    inventoryframe.pack();
    inventoryframe.getContentPane().setLayout(null);

    JLabel lblInventory = new JLabel("Inventory Management");
    lblInventory.setBounds(56, 32, 234, 27);
    lblInventory.setFont(new Font("Tahoma", Font.PLAIN, 22));
    inventoryframe.getContentPane().add(lblInventory);

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setBounds(56, 130, 479, 249);
    inventoryframe.getContentPane().add(scrollPane);

    table = new JTable();
    table.setShowVerticalLines(false);
    table.setShowHorizontalLines(false);
    table.setShowGrid(false);
    table.setFillsViewportHeight(true);
    table.setModel(new DefaultTableModel(
            new Object[][] {
            },
            new String[] {
                    "t", "e"
            }
            ));
    scrollPane.setViewportView(table);


    checkbox = new JCheckBox("borrow");
    checkbox.setHorizontalAlignment(SwingConstants.CENTER);
    checkbox.setBounds(360, 63, 97, 23);

    TableColumn sportColumn = table.getColumnModel().getColumn(1);
    sportColumn.setCellEditor(new DefaultCellEditor(checkbox));


    doIt();
}

public void doIt(){
    DefaultTableModel dtm = (DefaultTableModel) table.getModel();
    dtm.getDataVector().removeAllElements();
    dtm.getColumnClass(0);
    ReadItemFromDB myReader = new ReadItemFromDB();
    List<Item> newItemList = myReader.showItems();
    @Override
     public Class getColumnClass() {
            return getValueAt(0, 1).getClass();
        }
    for (Item myNewItems : newItemList) {
        Object[] rowData = new Object[1];


        rowData[0] =myNewItems.getItemID();



        dtm.addRow(rowData);
    }

    table.updateUI();


}



/*public Boolean getColumnClass(){
    dtm.getValueAt(0, 1).getClass();
    return null;

}*/

}


person harraypotter    schedule 26.01.2014    source источник
comment
Флажок отображается только в том случае, если я нажму на него. — Использовать визуализатор, а не редактор.   -  person Paul Samsotha    schedule 26.01.2014
comment
Взгляните на это   -  person Paul Samsotha    schedule 26.01.2014
comment
Я извиняюсь, пожалуйста, подробнее ?? Можете ли вы показать пример?   -  person harraypotter    schedule 26.01.2014


Ответы (1)


«Извините, пожалуйста, подробнее ?? Можете показать пример?»

Нет необходимости в пользовательских рендерерах или редакторах. Просто @Override getColumnClass() в модели таблицы, используйте DefaultTableModel и используйте только типы Boolean для этого столбца.

Ниже приведен пример работы, и вот важная часть

    DefaultTableModel model = new DefaultTableModel(data, cols) {
        @Override
        public Class getColumnClass(int column) {
            return getValueAt(0, column).getClass();
        }
    };
    JTable table = new JTable(model);

Вот полный код

import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TestTableCheck {

    private static JTable createTable() {
        Object[][] data = {{true, true, true}, {false, false, false}};
        String[] cols = {"Bibitty", "Boppity", "Boo"};

        DefaultTableModel model = new DefaultTableModel(data, cols) {
            @Override
            public Class getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };
        JTable table = new JTable(model);

        return table;
    }

    public static void main(String[] args) {
        JOptionPane.showMessageDialog(null,
                new JScrollPane(createTable()),
                "Table",
                JOptionPane.PLAIN_MESSAGE);
    }
}

введите здесь описание изображения


ОБНОВИТЬ

Вот ваш код. Посмотрите на метод initialize(), где я закомментировал часть вашего кода и добавил свой ниже. Также я избавился от метода doit(). Также вы должны pack() в конце метода, а также setVisible(). Я также добавил метод main, чтобы его можно было запустить.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Font;

import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.DefaultCellEditor;
import javax.swing.JTextField;
import javax.swing.JCheckBox;
import javax.swing.SwingConstants;

import javax.swing.SwingUtilities;

public class Inventory {

    private JFrame inventoryframe;
    private JTable table;
    private JTextField textField;
    private JCheckBox checkbox;

    /**
     * Launch the application.
     */
    public void InventoryWindow() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Inventory window = new Inventory();
                    window.inventoryframe.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Inventory() {
        initialize();

    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        inventoryframe = new JFrame();
        inventoryframe.setExtendedState(JFrame.MAXIMIZED_BOTH);
        inventoryframe.getContentPane().setBackground(new Color(153, 204, 102));
        inventoryframe.getContentPane().setForeground(new Color(255, 255, 255));
        inventoryframe.getContentPane().setPreferredSize(new Dimension(1365, 747));
        inventoryframe.getContentPane().setLayout(null);

        JLabel lblInventory = new JLabel("Inventory Management");
        lblInventory.setBounds(56, 32, 234, 27);
        lblInventory.setFont(new Font("Tahoma", Font.PLAIN, 22));
        inventoryframe.getContentPane().add(lblInventory);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(56, 130, 479, 249);
        inventoryframe.getContentPane().add(scrollPane);

        table = new JTable();
        table.setShowVerticalLines(false);
        table.setShowHorizontalLines(false);
        table.setShowGrid(false);
        table.setFillsViewportHeight(true);
        /* table.setModel(new DefaultTableModel(
         new Object[][]{},
         new String[]{
         "t", "e"
         }
         ));*/
        Object[][] data = {{true, true, true}, {false, false, false}};
        String[] cols = {"Bibitty", "Boppity", "Boo"};

        DefaultTableModel model = new DefaultTableModel(data, cols) {
            @Override
            public Class getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };
        table.setModel(model);
        scrollPane.setViewportView(table);

        checkbox = new JCheckBox("borrow");
        checkbox.setHorizontalAlignment(SwingConstants.CENTER);
        checkbox.setBounds(360, 63, 97, 23);

        TableColumn sportColumn = table.getColumnModel().getColumn(1);
        sportColumn.setCellEditor(new DefaultCellEditor(checkbox));

       inventoryframe.pack();
       inventoryframe.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Inventory();
            }
        });
    }
}

ОБНОВЛЕНИЕ 2

На самом деле это должен быть совсем другой вопрос, но сегодня я чувствую себя щедрым.

Используйте этот тестовый класс. Запустить его. Когда вы нажмете кнопку, откроется класс Inventory. Вероятно, вы не создали экземпляр Inventory в своей кнопке actionPerformed. Убедитесь, что этот файл класса находится в том же пакете, что и файл класса Inventory. И просто запустите класс ниже.

import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class InventoryTest extends JFrame {

    public InventoryTest() {
        setLayout(new GridBagLayout());
        JButton show = new JButton("Show Inventory");
        add(show);

        show.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                new Inventory();
            }
        });

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 400);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new InventoryTest();

            }
        });
    }
}
person Paul Samsotha    schedule 26.01.2014
comment
Здравствуйте, спасибо, я изучал ваш код, поэтому я не смог быстро ответить, пожалуйста, помогите мне, потому что я не знаю, где что разместить. вот мой код - person harraypotter; 26.01.2014
comment
спасибо .. я пытаюсь изучить это, извините за то, что занял некоторое время .... :( я новичок :( и я действительно не могу понять :( - person harraypotter; 26.01.2014
comment
Где это находится? Отредактируйте свой пост. - person Paul Samsotha; 26.01.2014
comment
Я изменил свой ответ, чтобы вам было легче. Этот способ в любом случае более правильный. - person Paul Samsotha; 26.01.2014
comment
хорошо, подождите, я отредактирую свой пост. К сожалению, я новичок здесь, поэтому я не знаю, где кнопки, подождите .. - person harraypotter; 26.01.2014
comment
См. мое ОБНОВЛЕНИЕ. Я должен выйти ненадолго. Поэтому, если этот ответ работает для вас, не забудьте принять его. (галочка); - person Paul Samsotha; 26.01.2014
comment
привет. Спасибо за ваши усилия. Извините, если я не могу собрать его так быстро. Я добавил изменения, которые вы сделали, но я удалил некоторые из ваших изменений, таких как добавление основного метода. Сэр, я не должен помещать основной метод в , потому что у меня есть основной метод в другом классе. И ошибка, с которой я столкнулся, когда вставила ваш код, была: когда я нажимаю кнопку, которая покажет этот класс, он не открывается :( - person harraypotter; 26.01.2014
comment
На самом деле, это должен быть совсем другой вопрос, чтобы опубликовать на этом сайте. Первоначальная проблема была решена для вас. Правильно будет accept ответить на этот вопрос, нажав на галочку, а затем задать другой вопрос на этом сайте. Я буду мил сегодня, помогу тебе еще. Посмотрите на мое ОБНОВЛЕНИЕ 2 . Если вы не понимаете об обработке событий и о том, как заставить кнопки обрабатывать события, то я не думаю, что смогу вам чем-то помочь. Вам нужно будет пройти несколько уроков. - person Paul Samsotha; 26.01.2014
comment
Я не знаю, сделает ли это яснее, но я использую Window Builder в eclipse.. - person harraypotter; 26.01.2014
comment
вы знаете, что вам не должно повторяться ошибки в коде вопроса, не так ли? Однако рефлекс понижения голосов временно заморожен ;-) - person kleopatra; 26.01.2014
comment
@kleopatra ошибки или плохие практики? Я не получил ошибок при тестировании кода. Что касается плохих практик, код в вопросе был автоматически сгенерирован затмениями, поэтому я не хотел сильно возиться с ним, просто пытаясь решить проблему ОП. - person Paul Samsotha; 26.01.2014
comment
@ Pink000 Это то, что вам нужно сделать с WindowBuilder. Щелкните правой кнопкой мыши кнопку и выберите Добавить обработчик событий > действие > действие выполнено. Затем перейдите к исходному коду, и вы увидите автоматически сгенерированный метод actionPerformed. Вот где вам нужно создать экземпляр new Inventory() - person Paul Samsotha; 26.01.2014
comment
нулевой макет / setXXSize являются ошибками - но, видя вашу точку зрения: прохождение OP через сгенерированный код - довольно сложная задача :-) - person kleopatra; 26.01.2014
comment
Да, я знаю это.. если вы увидите весь проект, вы увидите, что я делаю НЕКОТОРЫЕ вещи правильно, у меня просто действительно проблема с этим флажком внутри таблицы, потому что, по правде говоря, я просто изучаю себя.. это почему до сих пор я все еще просматриваю некоторые ответы. - person harraypotter; 26.01.2014