2010-04-10 2 views
4

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

TablePanel.png http://i42.tinypic.com/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; 
     } 
    } 
} 

ответ

8

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

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

Edit:

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

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

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

+0

+1 Спасибо за напоминание о обходе. Это не важно для этого, но статья хорошая. Моя пустая идея столбца также сделала проблему с сортировкой. –

+0

О, вот что это значит! Я изменил его ниже. Благодарю. –

2

Не зная, что вы хотите показать в этой таблице, это трудно сказать, есть ли у вас выбран хорошее решение или нет.

Относительно этого решения. Этот столбец не выглядит как разделитель. Нарисуйте его серым/другим цветом или ячейкой заголовка разделителя красок в белом цвете.

Но в любом случае я предпочел бы JScrollPane + две таблицы внутри него вместо этого решения.

5

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

TablePanel http://i41.tinypic.com/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()); 
} 
+1

См. Мое редактирование выше. – camickr

1

Пожалуйста, обратите внимание на ответ на этот вопрос, некоторые интересные новые предложения было дано здесь: Column dividers in JTable or JXTable

+0

Не то, что я искал, оказывается, но, возможно, полезно для кого-то, кто приземляется здесь. +1 –

Смежные вопросы