Использование пустого столбца в качестве делителя в JTable
Вопрос
Я пытаюсь использовать пустой столбец в качестве делителя между парами колонн в JTable
. Отказ Вот картинка и код для того, что я имею до сих пор. Я знаю, что могу изменить взгляд, используя обычай TableCellRenderer
. Отказ Прежде чем я пойду на эту дорогу, есть ли лучший способ сделать это? Любые идеи оценили.
import javax.swing.*;
import javax.swing.table.*;
public class TablePanel extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame("TablePanel");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.add(new TablePanel());
f.pack();
f.setVisible(true);
}
});
}
public TablePanel() {
TableModel dataModel = new MyModel();
JTable table = new JTable(dataModel);
table.getColumnModel().getColumn(MyModel.DIVIDER).setMaxWidth(0);
JScrollPane jsp = new JScrollPane(table);
jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.add(jsp);
}
private static class MyModel extends AbstractTableModel {
private static final int DIVIDER = 2;
private final String[] names = { "A1", "A2", "", "B1", "B2" };
@Override
public int getRowCount() {
return 32;
}
@Override
public int getColumnCount() {
return names.length;
}
@Override
public String getColumnName(int col) {
if (col == DIVIDER) return "";
return names[col];
}
@Override
public Object getValueAt(int row, int col) {
if (col == DIVIDER) return "";
return (row + 1) / 10.0;
}
@Override
public Class<?> getColumnClass(int col) {
if (col == DIVIDER) return String.class;
return Number.class;
}
}
}
Решение
Что касается проблем с этим подходом, чтобы пользователь понадобился «вкладка на колонку делителя. Вы могли бы использовать Таблица табуляции Предложение, чтобы сделать его более удобным для пользователя.
Или, если в табуке между двумя таблицами не важно, то, возможно, вы можете использовать использование двух таблиц и поставить любой делитель, который вы хотите, чтобы президете на двоих. Модель выбора может поделиться при необходимости.
Редактировать:
Поскольку я предложил вышеупомянутые модели, проще, чем написание пользовательских слушателей. Чтобы сохранить прокрутку синхронизации, код будет:
jspa.getVerticalScrollBar().setModel( jspb.getVerticalScrollBar().getModel() );
Вы также можете сделать то же самое с моделью выбора, чтобы выделение строк в синхронизации.
Другие советы
Я вроде комбинируемых оба ответа: я использовал две таблицы, которые разделяют одну прокрутку. Это работает с сортировкой, и он на самом деле делает модель проще. Табела не имеет значения, но сравнение «A» и «B» делает. Я думаю, что я пытался решить проблему «взгляда» в «модели». Я сделал это отдельный ответ, потому что я был бы признателен за любые критические комментарии.
public TablePanel() {
this.setLayout(new GridLayout(1, 0, 8, 0));
JTable tableA = new JTable(new MyModel("A"));
tableA.setPreferredScrollableViewportSize(new Dimension(200, 400));
final JScrollPane jspA = new JScrollPane(tableA);
jspA.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
this.add(jspA);
JTable tableB = new JTable(new MyModel("B"));
tableB.setPreferredScrollableViewportSize(new Dimension(200, 400));
final JScrollPane jspB = new JScrollPane(tableB);
jspB.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.add(jspB);
tableA.setSelectionModel(tableB.getSelectionModel());
jspA.getVerticalScrollBar().setModel(jspB.getVerticalScrollBar().getModel());
}
Не зная, что вы хотите показать в этой таблице, трудно сказать, вы выбрали хорошее решение или нет.
Относительно этого решения. Этот столбец не выглядит как делитель. Нарисуйте его серым / другим цветом или клеточной ячейкой разделителя краски в белизне.
Но в любом случае я бы предпочел Jscrollpane + две таблицы внутри него вместо этого решения.
Пожалуйста, посмотрите на ответ на этот вопрос, там было дано немного хорошего нового предложения: Разделители столбцов в JTable или Jxtable