1

ctrlJTable に対して単純な+を実行しようとしましたcが、コントロール ボタンを使用すると、指定したセルではなく、行全体がコピーされます。望ましい効果を得るにはどうすればよいですか?

public class ClipboardTable {

private static final Clipboard clipboard = Toolkit.getDefaultToolkit()
        .getSystemClipboard();
public static JTable tab;

public static void copyToClipboard(JTable ctaable) {
    StringBuilder str = new StringBuilder("");
    for (int i = 0; i < ctaable.getSelectedRows().length; i++) {
        str.append(ctaable.getValueAt(ctaable.getSelectedRows()[i], 0));
    }
    StringSelection strsel = new StringSelection(str.toString());
    clipboard.setContents(strsel, strsel);
    System.out.println("expected: "+str.toString());
}

public static void main(String[] args) {
    JFrame jf = new JFrame();
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Object[][] data = {{1,2,3},{5,6,7},{8,9,0}};
    tab = new JTable(data, new String[] {"a","b","c"});
    KeyListener searchKeyListen = new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            ClipboardTable.copyToClipboard(ClipboardTable.tab); //this works fine
            if (e.isControlDown()) {
                if ((e.getKeyCode() == KeyEvent.VK_C)) {
                    ClipboardTable.copyToClipboard(ClipboardTable.tab); // whole row is copied instead of only Cell
                }
            }
        }
    };
    tab.addKeyListener(searchKeyListen);
    jf.add(tab);
    jf.pack();
    jf.setVisible(true);
}
}
4

3 に答える 3

2

/はSwingコンポーネントで使用すると既知の問題があるため、Swingにはキーバインディングを使用します。KeyListenerKeyAdapter

上記の実装で正常に動作するようです:

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.KeyStroke;

public class ClipboardTable {

    private static final Clipboard clipboard = Toolkit.getDefaultToolkit()
            .getSystemClipboard();
    public static JTable tab;

    public static void copyToClipboard(JTable ctaable) {
        StringBuilder str = new StringBuilder("");
        for (int i = 0; i < ctaable.getSelectedRows().length; i++) {
            str.append(ctaable.getValueAt(ctaable.getSelectedRows()[i], 0));
        }
        StringSelection strsel = new StringSelection(str.toString());
        clipboard.setContents(strsel, strsel);
        System.out.println("expected: " + str.toString());
    }

    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Object[][] data = {{1, 2, 3}, {5, 6, 7}, {8, 9, 0}};
        tab = new JTable(data, new String[]{"a", "b", "c"});

        tab.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK, true), "CTRL C");
        tab.getActionMap().put("CTRL C", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                ClipboardTable.copyToClipboard(ClipboardTable.tab); // whole row is copied instead of only Cell
            }
        });

        jf.add(tab);
        jf.pack();
        jf.setVisible(true);
    }
}
于 2013-01-02T18:03:08.670 に答える
1

セルごとに選択範囲を設定できます。

tab.setCellSelectionEnabled(true);

Swing で推奨されるアプローチは、キー バインディングを使用することです。KeyListeners

于 2013-01-02T17:54:53.410 に答える
1

あなたがすべき

  • を取り外しますKeyListener
  • 代わりにAction、正しいキー バインディングを持つ を選択してください。Action使用できるように、TransferHandler.getCopyAction()
  • 標準的な動作に満足できない場合に備えて、カスタムTransferHandlerを設定してくださいJTable
于 2013-01-02T17:56:25.693 に答える