スタンプ箱順番入替のインターフェース
スタンプ箱の項目を入れ替えるとき,フォルダの上にドロップするとフォルダの中に入ってしまい,どうしてもフォルダの前後に項目を移動することができない。そこで,フォルダの上にドロップしたときは,フォルダの中ではなく,そのフォルダの前に置くようにする。フォルダの中に入れたいときは,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」カテゴリの記事
- OpenDolphin: Java 25 / WildFly 38 への移行(2025.11.09)
- 運用17年目のまとめ(2025.02.03)
- IME on/off の切換 - その2(2024.12.02)
- OrcaController オルコン(2024.11.28)
- OpenDolphin: java 21 / wildfly 34 への移行(2024.11.08)


