ИМХО, это лучшее решение для использования

орое время я возился с этим, и все решения и рабочие примеры, которые я мог найти, включали флажки, отображаемые с использованием встроенного логического TableCellRenderers, то есть ячейка могла иметь только флажок. Я не нашел ни одного рабочего примера, где рядом с этим флажком был бы какой-то текст в той же самой ячейке, или, более конкретно, JCheckBox, который допускает флажок и текст.

 MadProgrammer17 дек. 2017 г., 02:51
Кроме того, вы можете использовать другой столбец для представления текста
 MadProgrammer17 дек. 2017 г., 02:44
Даже не пытаясь ничего другого, я предлагаю вам начать сИспользование пользовательских средств визуализации
 MadProgrammer17 дек. 2017 г., 02:48
Мне также было бы интересно узнать, почему вам нужно текст, связанный с флажком в ячейке таблицы, так как заголовок столбца должен (в большинстве случаев) предоставить описание намерения ... просто сказать
 MadProgrammer17 дек. 2017 г., 03:18
Посмотрите, это ваши потребности, а не мои, даже с вашим расширенным контекстом, я все равно (личное) учусь к одному столбцу для флажка и для связанного текста, но это только я
 steep17 дек. 2017 г., 03:09
Что касается идеи использования другого столбца для представления текста - в принципе это возможно, но это не очень удобно для моих целей. Есть заголовки столбцов, которые описывают, что находится в этом столбце, но дело в том, что есть также заголовки строк (то есть - первый столбец в таблице), поэтому каждая строка различна. В каждой ячейке я должен указать материал, который описывает, что имеет отношение к этой строке. Этот текст рядом с флажком имеет важное значение.

Ответы на вопрос(1)

олчанию, вам нужно искать индивидуальное решение

Я бы порекомендовал вам начать с взгляда наИспользование пользовательских средств визуализации

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public class Data {
        private String text;
        private boolean selected;

        public Data(String text, boolean selected) {
            this.text = text;
            this.selected = selected;
        }

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }

        public boolean isSelected() {
            return selected;
        }

        public void setSelected(boolean state) {
            this.selected = state;
        }

    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());
            DefaultTableModel model = new DefaultTableModel(new String[] {"Something"}, 0) {
                @Override
                public Class<?> getColumnClass(int columnIndex) {
                    return Data.class;
                }
            };
            model.addRow(new Object[]{new Data("Hello", true)});
            model.addRow(new Object[]{new Data("Goodbye", false)});
            model.addRow(new Object[]{new Data("Do you want to play a game?", true)});
            model.addRow(new Object[]{new Data("Yesturday", false)});
            model.addRow(new Object[]{new Data("Tomorrow", true)});
            model.addRow(new Object[]{new Data("Java", false)});
            model.addRow(new Object[]{new Data("Swift", false)});
            model.addRow(new Object[]{new Data("Helicopter", true)});


            JTable table = new JTable(model);
            table.setDefaultRenderer(Data.class, new DataTableCellRenderer());

            add(new JScrollPane(table));
        }

    }

    public class DataTableCellRenderer extends JCheckBox implements TableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (isSelected) {
                setBackground(table.getSelectionBackground());
                setForeground(table.getSelectionForeground());
            } else {
                setBackground(table.getBackground());
                setForeground(table.getForeground());
            }

            if (value instanceof Data) {
                Data data = (Data)value;
                setText(data.getText());
                setSelected(data.isSelected());
            }

            return this;
        }

    }

}

На данный момент, я задаюсь вопросом, еслиJTable это лучшее решение, и еслиJList может быть лучше

Конечно, еще один вариант, который может работать лучшеJTab,leбыло бы разработать обычайTableModel который может разбить данные на отдельные столбцы ...

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public class Data {

        private String text;
        private boolean selected;

        public Data(String text, boolean selected) {
            this.text = text;
            this.selected = selected;
        }

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }

        public boolean isSelected() {
            return selected;
        }

        public void setSelected(boolean state) {
            this.selected = state;
        }

    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());
            DataTableModel model = new DataTableModel();
            model.add(new Data("Hello", true));
            model.add(new Data("Goodbye", false));
            model.add(new Data("Do you want to play a game?", true));
            model.add(new Data("Yesturday", false));
            model.add(new Data("Tomorrow", true));
            model.add(new Data("Java", false));
            model.add(new Data("Swift", false));
            model.add(new Data("Helicopter", true));

            JTable table = new JTable(model);

            add(new JScrollPane(table));
        }

    }

    public class DataTableModel extends AbstractTableModel {

        private List<Data> rows = new ArrayList<>(25);

        public void add(Data data) {
            int rowCount = getRowCount();
            rows.add(data);
            fireTableRowsInserted(rowCount, rowCount);
        }

        @Override
        public String getColumnName(int column) {
            switch (column) {
                case 0: return "";
                case 1: return "Option";
            }
            return null;
        }

        @Override
        public int getRowCount() {
            return rows.size();
        }

        @Override
        public int getColumnCount() {
            return 2;
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            switch (columnIndex) {
                case 0: return Boolean.class;
                case 1: return String.class;
            }
            return Object.class;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            Data row = rows.get(rowIndex);
            switch (columnIndex) {
                case 0: return row.isSelected();
                case 1: return row.getText();
            }
            return null;
        }



    }

}

ИМХО, это лучшее решение для использованияJTable

Ваш ответ на вопрос