Select 由 TableCellRenderer 呈现的 JPanel 内的 JTextArea 文本
Select text of a JTextArea that is inside a JPanel rendered by a TableCellRenderer
我有一个 JTable,其中所有行都由自定义 TableCellRenderer 呈现。
在最后一个方法中,getTableCellRendererComponent returns 一个面板,里面有一些东西,包括 JTextArea。
我如何向用户添加此面板内 JTextArea 的文本(使用鼠标,就像普通的 JTextArea)select 的可能性?
单元格渲染器不是交互式的(意味着用户无法编辑或 select 内容)。因此,除了单元格渲染器之外,您还需要添加单元格编辑器。
试试这个示例代码。它将给出下面屏幕截图中显示的 table。 (黄色单元格是编辑器。其他灰色单元格是渲染器。)用户可以 select 编辑器中的文本并复制它 (Ctrl+C)。
import javax.swing.*;
import javax.swing.event.CellEditorListener;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.util.EventObject;
public class TextAreaRenderer
{
public static void main(String[] args)
{
JTable table = new JTable(new String[][] {{"ABC"}, {"PQR"}}, new String[] {"Column Name"});
table.getColumnModel().getColumn(0).setCellRenderer(new CustomRenderer());
table.getColumnModel().getColumn(0).setCellEditor(new CustomEditor());
table.setRowHeight(30);
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new JScrollPane(table));
f.pack();
f.setVisible(true);
}
}
class CustomRenderer implements TableCellRenderer
{
private JPanel panel = new JPanel();
private JTextArea textArea = new JTextArea();
CustomRenderer()
{
panel.add(new JLabel("Label"));
panel.add(textArea);
}
@Override
public java.awt.Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
{
textArea.setText((String) value);
return panel;
}
}
class CustomEditor implements TableCellEditor
{
private JPanel panel = new JPanel();
private JTextArea textArea = new JTextArea();
CustomEditor()
{
panel.add(new JLabel("Label"));
panel.add(textArea);
panel.setBackground(Color.yellow);
}
@Override
public java.awt.Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
int row, int column)
{
textArea.setText((String) value);
return panel;
}
@Override
public Object getCellEditorValue()
{
return textArea.getText();
}
@Override
public boolean isCellEditable(EventObject anEvent) { return true; }
@Override
public boolean shouldSelectCell(EventObject anEvent) { return true; }
@Override
public boolean stopCellEditing() { return true; }
@Override
public void cancelCellEditing() {}
@Override
public void addCellEditorListener(CellEditorListener l) {}
@Override
public void removeCellEditorListener(CellEditorListener l) {}
}
我有一个 JTable,其中所有行都由自定义 TableCellRenderer 呈现。 在最后一个方法中,getTableCellRendererComponent returns 一个面板,里面有一些东西,包括 JTextArea。 我如何向用户添加此面板内 JTextArea 的文本(使用鼠标,就像普通的 JTextArea)select 的可能性?
单元格渲染器不是交互式的(意味着用户无法编辑或 select 内容)。因此,除了单元格渲染器之外,您还需要添加单元格编辑器。
试试这个示例代码。它将给出下面屏幕截图中显示的 table。 (黄色单元格是编辑器。其他灰色单元格是渲染器。)用户可以 select 编辑器中的文本并复制它 (Ctrl+C)。
import javax.swing.*;
import javax.swing.event.CellEditorListener;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.util.EventObject;
public class TextAreaRenderer
{
public static void main(String[] args)
{
JTable table = new JTable(new String[][] {{"ABC"}, {"PQR"}}, new String[] {"Column Name"});
table.getColumnModel().getColumn(0).setCellRenderer(new CustomRenderer());
table.getColumnModel().getColumn(0).setCellEditor(new CustomEditor());
table.setRowHeight(30);
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new JScrollPane(table));
f.pack();
f.setVisible(true);
}
}
class CustomRenderer implements TableCellRenderer
{
private JPanel panel = new JPanel();
private JTextArea textArea = new JTextArea();
CustomRenderer()
{
panel.add(new JLabel("Label"));
panel.add(textArea);
}
@Override
public java.awt.Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
{
textArea.setText((String) value);
return panel;
}
}
class CustomEditor implements TableCellEditor
{
private JPanel panel = new JPanel();
private JTextArea textArea = new JTextArea();
CustomEditor()
{
panel.add(new JLabel("Label"));
panel.add(textArea);
panel.setBackground(Color.yellow);
}
@Override
public java.awt.Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
int row, int column)
{
textArea.setText((String) value);
return panel;
}
@Override
public Object getCellEditorValue()
{
return textArea.getText();
}
@Override
public boolean isCellEditable(EventObject anEvent) { return true; }
@Override
public boolean shouldSelectCell(EventObject anEvent) { return true; }
@Override
public boolean stopCellEditing() { return true; }
@Override
public void cancelCellEditing() {}
@Override
public void addCellEditorListener(CellEditorListener l) {}
@Override
public void removeCellEditorListener(CellEditorListener l) {}
}