2

セルを編集可能にした場合と同じようにセルを動作させたい JTable がありますが、セルを編集可能にすることはできません。つまり、読み取り専用です。したがって、セルをダブルクリックすると、セル内のテキストのみを選択し、そのセルからテキストをコピーできるはずです。

4

3 に答える 3

5

ユーザーが変更を加えるのを防ぐことは可能ですか?

カスタム エディターを使用する必要があります。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.text.*;

public class TableCopyEditor extends JPanel
{
    public TableCopyEditor()
    {
        String[] columnNames = {"Editable", "Non Editable"};
        Object[][] data =
        {
            {"1", "one"},
            {"2", "two"},
            {"3", "three"}
        };

        JTable table = new JTable(data, columnNames);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );

        //  Create a non-editable editor, but still allow text selection

        Caret caret = new DefaultCaret()
        {
            public void focusGained(FocusEvent e)
            {
                setVisible(true);
                setSelectionVisible(true);
            }
        };
        caret.setBlinkRate( UIManager.getInt("TextField.caretBlinkRate") );

        JTextField textField = new JTextField();
        textField.setEditable(false);
        textField.setCaret(caret);
        textField.setBorder(new LineBorder(Color.BLACK));

        DefaultCellEditor dce = new DefaultCellEditor( textField );
        table.getColumnModel().getColumn(1).setCellEditor(dce);
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("Table Copy Editor");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new TableCopyEditor() );
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }

}
于 2013-06-18T19:32:54.233 に答える
1

テーブルでセル選択が有効になっている場合、デフォルトで、選択したセルからコピー/貼り付けできます。

以下は、セル選択がオンになっている読み取り専用の JTable と、貼り付け先の JTextField を使用したデモです。

import java.awt.*;

import javax.swing.*;
import javax.swing.table.*;

public class TableCellSelectionDemo implements Runnable
{
  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new TableCellSelectionDemo());
  }

  public void run()
  {
    String[] columnNames = {"First", "Last"};
    Object[][] data =
    {
      {"Barney", "Rubble"},
      {"Fred", "Flintstone"}
    };

    DefaultTableModel model = new DefaultTableModel(data, columnNames)
    {
      @Override
      public boolean isCellEditable(int row, int column)
      {
        return false;
      }
    };

    JTable table = new JTable(model);
    table.setCellSelectionEnabled(true);
    table.setPreferredScrollableViewportSize(table.getPreferredSize());

    JScrollPane scroll = new JScrollPane(table);
    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    scroll.setHorizontalScrollBarPolicy(
        JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

    JTextField text = new JTextField(40);

    JFrame frame = new JFrame("Demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(scroll, BorderLayout.CENTER);
    frame.getContentPane().add(text, BorderLayout.SOUTH);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}
于 2013-06-18T19:28:28.367 に答える