Я хотел бы использовать 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);
}
}
}
Renderer используется только для рисования. Читайте о TableCellEditor – StanislavL