Не могу решить две задачи:
1. Если выставлять высоту ячеек из рендерера то таблица мерцает. Как правельно это делать чтобы не было постоянных обновлений ?
2. При редактироавнии данных в ячейке, для удобства решил во время редактирования менять ее высоту, но столкнулся с проблемой следующей. Если таблица из одной колонки все норамально, а если из двух и более то рендерер не дает эдитору поменять размер высоты строки. Как только не извращался ничего не выходит.
P.S. Заметил такую вещь, если дебагером следить за рендером, то раз через несколько в нем твориться что попало, то высота строк не вычисляеться, то данные в JTextArea вообще не присваиваются.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumnModel;
import java.awt.*;
import java.util.Date;
public class DataTableCellRenderer extends DefaultTableCellRenderer
{
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column)
{
TableColumnModel columnModel = table.getColumnModel();
int columnWidth = columnModel.getColumn(column).getWidth();
if (value== null ) value = "";
if (value instanceof String)
{
JTextArea text = new JTextArea();
text.setWrapStyleWord(true);
text.setLineWrap(true);
if (isSelected)
{
text.setOpaque(true);
text.setForeground(table.getSelectionForeground());
text.setBackground(table.getSelectionBackground());
}
else
{
text.setForeground(table.getForeground());
text.setBackground(table.getBackground());
}
text.setFont(table.getFont());
text.setText((String) value);
text.setSize(columnWidth, 100000 );
int height = ( int )text.getPreferredSize().getHeight();
if (table.getRowHeight(row) != height)
table.setRowHeight(row, height);
return text;
}
if (value instanceof ImageIcon)
{
setIcon((ImageIcon)value);
setHorizontalAlignment(JLabel.CENTER);
setSize(columnWidth, 100000 );
int height = ( int )getPreferredSize().getHeight();
if (table.getRowHeight(row) != height)
table.setRowHeight(row, height);
return this ;
}
if (value instanceof Date)
{
}
return null ;
}
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
import javax.swing.*;
import javax.swing.table.TableCellEditor;
import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.util.EventObject;
import java.util.Date;
public class TextCellEditor extends AbstractCellEditor implements TableCellEditor
{
private JTextArea textArea;
public TextCellEditor()
{
textArea = new JTextArea();
textArea.setWrapStyleWord(true);
textArea.setLineWrap(true);
textArea.addFocusListener( new JTextAreaFocusListener());
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected,
int row, int column) {
if (value instanceof String)
{
String str = (String)value;
textArea.setText(str);
FontMetrics metrics = textArea.getFontMetrics((textArea.getFont()));
int stringWidth = metrics.stringWidth(str);
int columnWidth = table.getColumnModel().getColumn(column).getWidth();
if (stringWidth < columnWidth)
table.setRowHeight(row, 48 );
return new JScrollPane(textArea);
}
if (value instanceof ImageIcon)
{
}
if (value instanceof Date)
{
}
return null ;
}
public Object getCellEditorValue()
{
return textArea.getText();
}
public boolean isCellEditable(EventObject anEvent)
{
if (anEvent instanceof MouseEvent) {
if (((MouseEvent)anEvent).getClickCount() < 2 )
return false;
}
return true;
}
class JTextAreaFocusListener implements FocusListener
{
public void focusGained(FocusEvent e)
{
}
public void focusLost(FocusEvent e)
{
if (e.getSource() instanceof JTextArea)
{
textArea.setText(((JTextArea)e.getSource()).getText());
}}}
}