From window, to wind

趣味のゲームとJavaプログラムなどについて 適当に書き綴るブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

マウスドラッグで表示するJPopupMenu

Sleipnirのプラグインのようにマウスドラッグで表示するJPopupMenuのプログラムです。
動作などが不完全ですので、余裕があったり少し力をつけたら書き直します。
プログラムの表示
dragupmenu.png


ソースコード
package program;

import java.awt.Component;
import java.awt.Font;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JLabel;
import javax.swing.JPopupMenu;
import javax.swing.text.DefaultEditorKit;
import javax.swing.text.JTextComponent;

public class DragupMenu extends JPopupMenu{

private final Action cutAction = new DefaultEditorKit.CutAction();
private final Action copyAction = new DefaultEditorKit.CopyAction();
private final Action pasteAction = new DefaultEditorKit.PasteAction();
private final Action deleteAction;
private final Action selectAllAction;
private Point p0 = new Point(0,0), p1 = new Point(0,0);
private boolean endkey = false, selectedkey = false;
private Font font = new Font(Font.DIALOG, Font.PLAIN, 16);
private JLabel jl = new JLabel("←:test");

DragupMenu(final JTextComponent jtc){
super();
add(cutAction);
add(copyAction);
add(pasteAction);
addSeparator();
add(deleteAction = new AbstractAction("delete") {
public void actionPerformed(ActionEvent evt) {
jtc.replaceSelection(null);
selectedkey=false;
}
});
add(selectAllAction = new AbstractAction("select all") {
public void actionPerformed(ActionEvent evt) {
jtc.selectAll();
selectedkey=false;
}
});

addSeparator();
jl.setFont(font);
add(jl);

jtc.addMouseMotionListener(new MouseMotionListener(){
public void mouseDragged(MouseEvent me) {
if(selectedkey){
p1 = me.getPoint();
if(Math.abs(p0.x-p1.x)>Math.abs(p0.y-p1.y)){
if(p0.x-p1.x>0){
jl.setText("←:test");
}else{
jl.setText("→:test");
}
}else{
if(p0.y-p1.y>0){
jl.setText("↑:test");
}else{
jl.setText("↓:test");
}
}
if(p1.distance(p0)>10){
if(!isShowing()){
show(jtc,p1.x+50,p1.y+50);
}
}
}
if(endkey){
//mouseReleased(me);
}
System.out.println("dragged");
}

public void mouseMoved(MouseEvent me) {

}

});

jtc.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent me) {

}
public void mouseEntered(MouseEvent me) {

}
public void mouseExited(MouseEvent me) {

}
public void mousePressed(MouseEvent me) {
if(jtc.getSelectedText()!=null){
selectedkey=true;
p0=me.getPoint();
}else{
selectedkey=false;
}
System.out.println("pressed");
}
public void mouseReleased(MouseEvent me) {
if(isShowing()){
setVisible(false);
selectedkey=false;
}
System.out.println("released");
}

});
}

public void show(Component c, int x, int y) {
JTextComponent textArea = (JTextComponent)c;
boolean flg = textArea.getSelectedText()!=null;
cutAction.setEnabled(flg);
copyAction.setEnabled(flg);
deleteAction.setEnabled(flg);
super.show(c, x, y);
}
}


呼び出しているコード
        jta = new JTextArea("testtesttest\ntesttestes\n\n\ntesttesttest\ntesttest");
DragupMenu dum = new DragupMenu(jta);
jta.setComponentPopupMenu(dum);


動作
テキストを選択した状態でマウスの右ボタンのドラッグイベントでプレスした位置から少し距離が離れたらshowメソッドで表示させます。
JLabelでマウスの移動した方向が分かるようにしていますが、XPのLookAndFeelのせいで左側に不要なセパレーターが表示されています。

問題点
JPopupMenuを選択するとJTextComponentのマウスリリースイベントが呼び出されず不正な状態になる。またテキスト選択状態で左ドラッグをすると別の処理が行われる問題がある。また右ボタンのクリックでも同じJPopupMenuが呼び出されてしまう。だれか対処法を教えてください。
スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://kagenyan.blog69.fc2.com/tb.php/36-75b0fa06
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。