私がしたいのは、JTree の編集中に、編集ボックスの外側をクリックすると編集をコミットしたいということです。
tree.setInvokesStopCellEditing(true);
JTree のどこかをクリックすると、編集がコミットされます。ただし、JTextPane のように JTree の外側をクリックすると、編集はコミットされません。したがって、質問:質問: フォーカスが失われたときに JTree がセルの編集を停止するようにするにはどうすればよいですか? または、JTree の場所の外側で左クリックすると? また、これを行うための好ましい方法はありますか?
注: 以下のコードでは、Focus Listener Annoymous 内部クラスを使用してこれを解決しようとし、疑似コードを試しました。WhenTreeLosesFocus() { if( tree.isEditing() ) tree.stopEditing(); }
編集時にフォーカスがツリー内の CellEditor コンポーネントに変更され、編集ボックスが点滅してすぐに点滅するため、これは機能しません。
ソリューションはフォーカスベースである必要はありません。JTree 領域の外側で左クリックすることができます。
SSCEが続きます(ところで、Convienenceのコードを実行すると、スペースバーとF2の両方がノードの名前を変更します。)
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextPane;
import javax.swing.JTree;
import javax.swing.KeyStroke;
public class StackExchangeQuestion3 {
public static void main(String[] args){
JFrame window = new JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setTitle("Stack Exchange Question");
window.setSize(400,500);//variable parameters would be best
window.setVisible(true);
JSplitPane split = new JSplitPane();
window.getRootPane().setContentPane(split);
JScrollPane left = new JScrollPane();
JScrollPane right = new JScrollPane();
JTree tree = new JTree();//loads sample tree data
tree.setEditable(true);//select a node then press F2 to edit (built in keybinding)
tree.getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "startEditing");//can edit with space now
tree.setInvokesStopCellEditing(true);//this helps stop editing within focus of tree
JTextPane text = new JTextPane();
split.setLeftComponent(left);
split.setRightComponent(right);
left.setViewportView(tree);
right.setViewportView(text);
split.setDividerLocation(200);
tree.addFocusListener(new FocusListener(){
public void focusGained(FocusEvent e) { }
public void focusLost(FocusEvent e) {
JTree tree = (JTree)e.getSource();
if( tree.isEditing() ) tree.stopEditing();
}
});//end addFocusListener
}//end main
}
いずれかの方法が他の方法よりも優先されるかどうかについての推論を含む解説は大歓迎です。マウスがJTreeの外側でクリックしたかどうかを検出する方法のヒント/正しい方向のヒント。