2014-08-18 2 views
0

Я хотел бы использовать JTable для отображения некоторых данных. Иногда данные могут быть немного большими, поэтому необходимо прокручивать внутри ячеек JTable.Как создать JTable-ячейку с прокручиваемым контентом

Я пытаюсь выполнить это с помощью приведенного ниже кода. Созданная таблица выглядит нормально, к сожалению, она не работает. Полоса прокрутки даже не реагирует на щелчки мыши.

Как это сделать без прокрутки прокрутки?

спасибо,

Торстен класс

package main; 

import java.awt.BorderLayout; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 

public class ScrollableCellTableTest extends JPanel { 

    JTable table; 
    String val = "This is my totally cool test data. "; 


    public ScrollableCellTableTest() { 

     setLayout(new BorderLayout()); 

     for (int t=0; t<10; t++) 
      val+=val; 

     table = new JTable(new String[][]{{val}}, new String[]{"colname"}) { 
      public boolean isCellEditable(int row, int column) { 
       return false; 
      } 
     }; 

     table.getColumnModel().getColumn(0) 
       .setCellRenderer(new ScrollableCellRenderer()); 

     add(new JScrollPane(table), BorderLayout.CENTER); 

    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     ScrollableCellTableTest scrollableCellTable = new ScrollableCellTableTest(); 
     frame.getContentPane().setLayout(new BorderLayout()); 
     frame.getContentPane().add(scrollableCellTable, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setLocation(500, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

} 

Клеточный рендерер:

package main; 

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextArea; 
import javax.swing.table.TableCellRenderer; 

/** 
* Scrollable Cell Renderer. 
*/ 
public class ScrollableCellRenderer extends JPanel implements 
     TableCellRenderer { 
    private List rowColHeight = new ArrayList(); 
    JScrollPane jScrollPane; 
    JTextArea textArea = new JTextArea(); 

    public ScrollableCellRenderer() { 
     textArea.setLineWrap(true); 
     textArea.setWrapStyleWord(true); 

     setLayout(new BorderLayout()); 
     add(textArea, BorderLayout.CENTER); 
     jScrollPane = new JScrollPane(this); 
    } 

    public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int row, int column) { 

     textArea.setText(value.toString()); 

     adjustRowHeight(table, row, column); 

     return new JScrollPane(this); 
    } 

    /** 
    * Calculate the new preferred height for a given row, and sets the height 
    * on the table. 
    */ 
    private void adjustRowHeight(JTable table, int row, int column) { 

     int cWidth = table.getTableHeader().getColumnModel().getColumn(column) 
       .getWidth(); 
     setSize(new Dimension(cWidth, 1000)); 
     int prefH = getPreferredSize().height; 

     // Limit the height, so scrollbars become neccessary 
     prefH = Math.min(prefH, 100); 


     while (rowColHeight.size() <= row) { 
      rowColHeight.add(new ArrayList(column)); 
     } 
     List colHeights = (List) rowColHeight.get(row); 
     while (colHeights.size() <= column) { 
      colHeights.add(new Integer(0)); 
     } 
     colHeights.set(column, new Integer(prefH)); 
     int maxH = prefH; 
     for (int t = 0; t < colHeights.size(); t++) { 
      int colHeight = ((Integer) colHeights.get(t)).intValue(); 
      if (colHeight > maxH) 
       maxH = colHeight; 
     } 
     if (table.getRowHeight(row) != maxH) { 
      table.setRowHeight(row, maxH); 
     } 

    } 
} 
+2

Renderer используется только для рисования. Читайте о TableCellEditor – StanislavL

ответ

1

Ваш подход никогда не будет работать, так как средство визуализации используется только для отображения содержимого ячейки. Возможно взаимодействие с рендерером. Вы можете обеспечить взаимодействие с содержимым ячейки только с помощью редактора. К сожалению, у вас может быть только один редактор одновременно. Единственный способ обеспечить прокрутку в фактической ячейке - установить прослушиватель мыши, который делает текущую выделенную ячейку редактируемой (возможно, с небольшой задержкой). В вашем слушателе вы должны отслеживать следующие события: перемещение (сделать ячейку в точке редактирования), ввод (то же, что и для перемещения) и выход (удалить текущий редактор, если он существует). Вероятно, этот подход также будет работать без слушателя: интерфейс CellEditor определяет метод isCellEditable(EventObject anEvent). Здесь вы должны попытаться проверить, является ли событие событием мыши, и его идентификатор входит, перемещается или выходит. И не забудьте определить соответствующие ячейки как редактируемые в вашей модели таблицы!

0

Иногда данные могут быть немного больше

Если это только «немного» больше, то самым простым решением является использование подсказке. Есть два способа сделать это:

  1. Создать пользовательский визуализатор и вызвать метод setToolTipText(...) в визуализаторе
  2. Переопределение getToolTipText(...) метод JTable вернуть всплывающую подсказку.
Смежные вопросы