JTable で複数行の編集ができるようにしたいと思っています。
JTextArea を使う独自の CellEditor を作ることで、できました。
ただ、編集を開始するのにマウスでダブルクリックする必要があります。
セルにフォーカスがある状態で、キーボード入力で編集を開始できないでしょうか?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
JTextField を使った DefaultCellEditor はできます。
自作の JTextArea を使う CellEditor でもできました。
しかし、JScrollPane を付けるとできなくなります。
解決策をご存知の方がいらっしゃいましたら、よろしくお願いします。
public class TextAreaCellEditor extends AbstractCellEditor implements
TableCellEditor {
private JTextArea textArea = new JTextArea();
private JScrollPane scroll = new JScrollPane(textArea);
public TextAreaCellEditor() {
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
}
public Object getCellEditorValue() {
return textArea.getText();
}
public boolean isCellEditable(EventObject anEvent) {
if (anEvent instanceof MouseEvent) {
return ((MouseEvent) anEvent).getClickCount() >= 2;
}
return true;
}
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
public boolean stopCellEditing() {
fireEditingStopped();
return true;
}
public void cancelCellEditing() {
fireEditingCanceled();
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
textArea.setText((value != null) ? value.toString() : "");
return scroll;
// JScrollPane を付けなければ可能
// return textArea;
}
}
No.1ベストアンサー
- 回答日時:
> セルにフォーカスがある状態で、
TABキーによる遷移のことなら、テーブルのアクションマップに新しいTABアクション(テキストエリアがキーフォーカスを取得する)を登録する必要があります。最初に、既存のアクションも呼び出す必要があるでしょうね。
_ranco_さん、ご回答ありがとうございます。
教えてもらったことをヒントに、F2キーを押すと編集できるように
なりました。
以下のような感じです。
---
ActionMap am = table.getActionMap();
final Action oldStartEditingAction = am.get("startEditing");
AbstractAction startEditingAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
oldStartEditingAction.actionPerformed(e);
textArea.requestFocus();
}
};
am.put("startEditing", startEditingAction);
---
理想をいうと、F2キーを押さなくても編集状態に
なってくれるといいんですけど。
TABキーは、"selectNextColumnCell" アクションを置き換えることに
なると思いますが、これはうまくいきませんでした。
それに、TABキーだけじゃなく、矢印キーで遷移した場合も
編集可能になってほしいです。
何か方法はないでしょうか?
No.3
- 回答日時:
次のようにすれば、テキストエリアにフォーカスを与えることができます:
--------------------------------------------------------------------
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class TextAreaCellEditor extends AbstractCellEditor implements
TableCellEditor, TableCellRenderer {
private JTextArea textArea;
private JScrollPane scroll;
public TextAreaCellEditor() {
textArea = new JTextArea();
scroll = new JScrollPane(textArea);
}
public JTextArea getTextArea(){
return textArea;
}
public Object getCellEditorValue() {
return textArea.getText();
}
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
public boolean stopCellEditing() {
fireEditingStopped();
return true;
}
public void cancelCellEditing() {
fireEditingCanceled();
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
textArea.setText((value != null) ? value.toString() : "");
textArea.setCaretPosition(textArea.getText().length());
return scroll;
}
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int column){
textArea.setText((value != null) ? value.toString() : "");
textArea.setCaretPosition(textArea.getText().length());
return scroll;
}
static void focusOnTextArea(JTable table){
InputMap im
= table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
final Action oldTabAction = table.getActionMap().get(im.get(tab));
Action tabAction = new AbstractAction(){
public void actionPerformed(ActionEvent e){
oldTabAction.actionPerformed(e);
JTable table = (JTable)e.getSource();
int row = table.getSelectedRow();
int column = table.getSelectedColumn();
if (column == 1){ // このセルエディタのカラムだ
table.editCellAt(row, column); // 強制的にエディットモードにする
TextAreaCellEditor tace
= (TextAreaCellEditor)(table.getCellEditor(row, column));
JTextArea ta = tace.getTextArea();
ta.requestFocusInWindow(); // テキストエリアにキーフォーカス
}
}
};
table.getActionMap().put(im.get(tab), tabAction);
// 右矢印キーも使いたい
KeyStroke right = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0);
im.put(right, im.get(tab));
}
/* test */
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container con = frame.getContentPane();
JTable table = new JTable(20, 3);
table.setRowHeight(70);
JScrollPane jsp = new JScrollPane(table);
con.add(jsp, BorderLayout.CENTER);
TextAreaCellEditor tace = new TextAreaCellEditor();
TableColumn tc = table.getColumn(table.getColumnName(1));
tc.setCellEditor(tace); // for column 1
tc.setCellRenderer(tace);
focusOnTextArea(table);
frame.pack();
frame.setVisible(true);
}
}
No.2
- 回答日時:
amのget()に具体的な名前ではなくInputMap.get()の結果をそのまま渡したほうがいいですね。
だいたいのストーリーは、次のようになるでしょう:------------------------------------------------
InputMap im
= table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
...
KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
...
final Action oldTabAction = table.getActionMap().get(im.get(tab));
Action tabAction = new AbstractAction(){
public void actionPerformed(ActionEvent e){
oldTabAction.actionPerformed(e);
...
...
...
...
}
}
...
table.getActionMap().put(im.get(tab), tabAction);
...
KeyStroke right = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0);
im.put(right, im.get(tab));
------------------------------------------------
InputMap.get()の結果をそのまま渡しても、編集可能には
なってくれませんでした。
#textArea.requestFocus()だけじゃダメなのかな
F2キーが使えるようになったので、今回はこれでよしとします。
ご回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#でのWNetAddConnection3の使...
-
unityでのC++エラーの原因がわ...
-
Junitテストでvoid戻り値メッソ...
-
vc++ 2005 Pictureboxの透過処理
-
C#,listBoxのItem追加について...
-
JScrollPaneで、表示がおかしく...
-
インターフェースを持つenum定...
-
JSPファイルから、ActionFormの...
-
C# visibleプロパティをfalseに...
-
C#で、あるクラスのメンバーす...
-
Thread.sleepのInterruptedExce...
-
Javaの課題について質問です。...
-
C# 半角カナの文字化けについて
-
ユーザーコントロールを動的に...
-
C#から、C++で作成したdll内の...
-
パソコンキーボードで時分秒を...
-
VBAで配列の計算
-
Path型をString型へ変換する(Java)
-
javaで質問です。 文字列2023/2...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#で、あるクラスのメンバーす...
-
Junitテストでvoid戻り値メッソ...
-
C#でのWNetAddConnection3の使...
-
C# visibleプロパティをfalseに...
-
C#でキーイベントが発生しない...
-
C# 矢印キーの取得
-
unityでのC++エラーの原因がわ...
-
ボタンの複数割り当てについて
-
Thread.sleepのInterruptedExce...
-
C# DataGridView列カスタマイズ
-
swing初心者です
-
C# 親フォームで指定した値を...
-
[C#.net]スレッド化された別フ...
-
文字列の置換
-
プログラミング(Java)じゃん...
-
C# バイナリダンプを構造体に簡...
-
SplitContainerについて
-
GetDIBits関数の使い方について
-
C# MouseHoverを何度も呼ぶには
おすすめ情報