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

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

TablePanel.png http://sofru.miximages.com/java/1zxpfkj.png

 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; } } } 

По проблеме с этим подходом это то, что пользователю понадобится «переместить» столбец разделителя. Вы можете использовать предложение Table Tabbing, чтобы сделать его более удобным для пользователя.

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

Редактировать:

Как я уже говорил выше, модели обмена проще, чем писать пользовательские слушатели. Чтобы сохранить прокрутку в синхронизации, код будет выглядеть следующим образом:

 jspa.getVerticalScrollBar().setModel( jspb.getVerticalScrollBar().getModel() ); 

Вы также можете сделать то же самое с моделью выбора, чтобы подсветка строк была синхронизирована.

Я как бы комбинировал оба ответа: я использовал две таблицы, которые делят свою полосу прокрутки. Это работает с сортировкой, и это фактически упрощает модель. Tabbing не имеет значения, но сравнение «A» и «B» делает. Я думаю, что пытался «решить проблему» в «модели». Я сделал это отдельным ответом, потому что я был бы признателен за любые критические замечания.

TablePanel http://sofru.miximages.com/java/2uqdtmo.png

 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

  • Java Swing - как показать панель поверх другой панели?
  • Swing - Обновить ярлык
  • ActionListener для конкретного текста внутри JTextArea?
  • изменение размера ImageIcon в JButton
  • Как получить значение из JTextField в Java Swing?
  • Как получить все элементы внутри JFrame?
  • Использование addMouseListener () и paintComponent () для JPanel
  • Эффективное цветовое отображение изображения на Java
  • Как разрешить ввод только цифр в jTextField?
  • Как использовать ключевые привязки вместо ключевых прослушивателей
  • Создание пользовательской кнопки в Java с помощью JButton
  • Interesting Posts

    Представление ограничения FOREIGN KEY может вызвать циклы или несколько каскадных путей – почему?

    В C ++ существует ли еще плохая практика вернуть вектор из функции?

    Как настроить выходную ширину вывода RStudio Markdown (в HTML)

    Как сообщить MS Excel использовать нестандартный десятичный разделитель в графиках и диаграммах?

    Событие Backbone.js после завершения view.render ()

    Как назначить статический IP-адрес моей машине VMWare?

    Выпадающие меню Bootstrap появляются за другими элементами – IE7

    Решения для хранения домашних медиа

    Как установить фоновый рисунок кнопки изображения для разных состояний?

    Большой запрос веб-службы WCF с ошибкой (400) Ошибка HTTP-запроса

    c: forEach throws javax.el.PropertyNotFoundException: свойство ‘foo’ не найдено по типу java.lang.String

    В чем разница между setWebViewClient и setWebChromeClient?

    Регулярное выражение для остановки при первом совпадении

    Преобразование XML-fragmentа String в узел документа в Java

    ASP MVC в IIS 7 приводит к: Ошибка HTTP 403.14 – Запрещено

    Давайте будем гением компьютера.