スタンプ箱順番入替のインターフェース
スタンプ箱の項目を入れ替えるとき,フォルダの上にドロップするとフォルダの中に入ってしまい,どうしてもフォルダの前後に項目を移動することができない。そこで,フォルダの上にドロップしたときは,フォルダの中ではなく,そのフォルダの前に置くようにする。フォルダの中に入れたいときは,ALT キーを押すか,フォルダを展開して,その中の希望の場所にドロップすることにする。
client/StampTreeTransferHandler.java の編集
public class StampTreeTransferHandler extends TransferHandler { ・ ・ // KartePaneからDropされるテキストFlavor private DataFlavor stringFlavor = DataFlavor.stringFlavor; ////↓ ALT キーの状態を保存 public boolean altPressed; public void setAltState(boolean a) { altPressed = a; } ////↑ ・ ・ @Override public boolean importData(JComponent c, Transferable tr) { if (canImport(c, tr.getTransferDataFlavors())) { ・ ・ // newChild is ancestor のケース if (newParent != dropNode) { // Drag元のStampTreeとDropされるTreeが同じかどうかを判定する // shouldRemove = (sourceTree == target) ? true : false; // Tree内のDnDはLocalTransferable(参照)の故、挿入時点で元のスタンプを // 常に削除する。DnD後の削除は行わない。 // shouldRemove = false; ////↓drop 位置が Leaf か, ALT が押されていなかったら前に挿入する // if (selected.isLeaf()) { if (selected.isLeaf() | !altPressed) { ////↑ // // Drop位置のノードが葉の場合、その前に挿入する ・ ・
client/StampTree.java の編集
public StampTree(TreeModel model) { ・ ・ this.putClientProperty("JTree.lineStyle", "Angled"); // 水平及び垂直線を使用する this.setEditable(false); // ノード名を編集不可にする this.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); // Single Selection// にする this.setRootVisible(true); //this.addMouseMotionListener(new MouseDragDetecter()); // オリジナルの listener はコメントアウト ////↓ 選択状態じゃなくてもドラッグ開始するための drag listener this.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseDragged (MouseEvent e) { getTransferHandler().exportAsDrag((JComponent) e.getSource(), e, TransferHandler.COPY); } }); // JTree のデフォルトの DropTarget をオーバーライドする DropTarget dt = new DropTarget(this, new DropTargetAdapter() { StampTree st; StampTreeTransferHandler sttf; TreePath initRow; @Override public void dragEnter(DropTargetDragEvent dtde) { // drag 開始時の path を記録しておく st = (StampTree) dtde.getDropTargetContext().getComponent(); sttf = (StampTreeTransferHandler) st.getTransferHandler(); initRow = st.getSelectionPath(); } @Override public void dragExit(DropTargetEvent dte) { // drop 領域から出たら,開始時の path に戻しておく st.setSelectionPath(initRow); } @Override public void dragOver(DropTargetDragEvent dtde) { // drop しようとしている部分を選択状態にする st.setSelectionPath(st.getClosestPathForLocation(dtde.getLocation().x, dtde.getLocation().y)); } public void drop(DropTargetDropEvent dtde) { // action= (ALT 押した場合が COPY) (押してないと MOVE) boolean alt = (dtde.getDropAction() == DnDConstants.ACTION_COPY)? true: false; sttf.setAltState(alt); // ALT の状態をセットしてから importData を呼ぶ st.getTransferHandler().importData(st, dtde.getTransferable()); dtde.dropComplete(true); // これをしないとドラッグしてきたアイコンが逃げる } }); dt.setActive(true); ////↑ ・ ・
« カルテ編集画面のスクロール | トップページ | 疑い病名の入力インターフェース »
「OpenDolphin」カテゴリの記事
- Java 17 への移行(7) - OpenDolphin client の対応 (2023.02.04)
- Java 17 への移行(6) - Hibernate 6 でやらかす(2023.02.03)
- Java 17 への移行(5) - OpenDolphin server の対応(2023.02.02)
- Java 17 への移行(4) - OpenSearch の準備 [ubuntu 編](2023.02.01)
- Java 17 への移行(3) - OpenSearch の準備 [mac 編](2023.01.31)