Выделите текст JTextArea, который находится внутри JPanel, представленного TableCellRenderer - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть JTable, где вся строка отображается пользовательским TableCellRenderer.В этом последнем метод getTableCellRendererComponent возвращает панель, в которой есть некоторые вещи, включая JTextArea.Как я могу добавить возможность пользователю выбирать текст (с помощью мыши, как обычный JTextArea) JTextArea, который находится внутри этой панели?

1 Ответ

0 голосов
/ 02 января 2019

Средства визуализации ячеек не являются интерактивными (означает, что пользователь не может редактировать или выбирать содержимое).Итак, вам нужно добавить редактор ячеек в дополнение к средству визуализации ячеек.

Попробуйте этот пример кода.Это даст таблицу, показанную на скриншоте ниже.(Желтая ячейка - редактор. Другая серая ячейка - средство визуализации.) Пользователь может выбрать текст в редакторе и скопировать его (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) {}
}

screenshot

...