Reputation: 139
Making use of both cell renderer and editor but still scrollbar isn't working please suggest anything that make it work scrollbar is not moving at all
class MultiRowCell extends AbstractCellEditor implements TableCellEditor, TableCellRenderer {
private JScrollPane scrollPane;
private JTextArea textArea;
public MultiRowCell() {
textArea = new JTextArea();
textArea.setEditable(true);
scrollPane = new JScrollPane(textArea);
}
@Override
public boolean isCellEditable(EventObject e) {
System.out.println(e);
return true;
}
@Override
public Object getCellEditorValue() {
return textArea.getText();
}
protected void setCellValue(Object value) {
if (value == null) {
textArea.setText(null);
} else {
textArea.setText(value.toString());
}
textArea.setCaretPosition(0);
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
setCellValue(value);
return scrollPane;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setCellValue(value);
return scrollPane;
}
}
//TextTableCellRenderer tr=new TextTableCellRenderer();
//table.getColumnModel().getColumn(1).setCellEditor(tr);
MultiRowCell re=new MultiRowCell();
table.getColumnModel().getColumn(1).setCellRenderer(re);
table.getColumnModel().getColumn(1).setCellEditor(re);
//table.getColumnModel().getColumn(1).setCellRenderer(r);
//table.getColumnModel().getColumn(1).setCellEditor(e);
//table.getColumnModel().getColumn(2).setCellRenderer(r);
//table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
panel.setLayout(new BorderLayout());
panel.add(table, BorderLayout.CENTER);
panel.add(table.getTableHeader(), BorderLayout.NORTH);
return panel;
Upvotes: 1
Views: 639
Reputation: 347332
Conceptually you will need a cell renderer AND cell editor in order to make it work, for example...
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.EventObject;
import javax.swing.AbstractCellEditor;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new BorderLayout());
String text = loadText();
String[][] data = new String[1][1];
data[0][0] = text;
DefaultTableModel model = new DefaultTableModel(data, new String[]{"Example"});
JTable table = new JTable(model);
TableColumnModel columnModel =table.getColumnModel();
TableColumn column = columnModel.getColumn(0);
MultiRowCell multiRowCell = new MultiRowCell();
column.setCellEditor(multiRowCell);
column.setCellRenderer(multiRowCell);
int height = multiRowCell.getTableCellRendererComponent(table, "Test", true, true, 0, 0).getPreferredSize().height;
table.setRowHeight(height);
add(new JScrollPane(table));
}
protected String loadText() {
StringBuilder sb = new StringBuilder(1024);
try (BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("Script.txt")))) {
String text = null;
while ((text = reader.readLine()) != null) {
sb.append(text).append(System.lineSeparator());
}
} catch (IOException ex) {
ex.printStackTrace();
}
return sb.toString();
}
}
public class MultiRowCell extends AbstractCellEditor implements TableCellEditor, TableCellRenderer {
private JScrollPane scrollPane;
private JTextArea textArea;
public MultiRowCell() {
textArea = new JTextArea(25, 50);
textArea.setEditable(false);
scrollPane = new JScrollPane(textArea);
}
@Override
public boolean isCellEditable(EventObject e) {
System.out.println(e);
return true;
}
@Override
public Object getCellEditorValue() {
return textArea.getText();
}
protected void setCellValue(Object value) {
if (value == null) {
textArea.setText(null);
} else {
textArea.setText(value.toString());
}
textArea.setCaretPosition(0);
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
setCellValue(value);
return scrollPane;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setCellValue(value);
return scrollPane;
}
}
}
Note, I read the entire Rouge One script from a local resource for the example, you'll need to supply your own text
Caveat: This example will require you to click the cell to switch to editing mode as the mouse wheel events are been used by the scroll pane that wraps the JTable
Upvotes: 1