1

実は、私はすでにここでこの質問をしています。しかし、私は間違いを犯しています。私はまだ解決策を得ていません。

まず、前の質問で、 Rectangle を取得できます

Rectangle rectangle = textArea.modelToView( textArea.getCaretPostion() );

XとYの位置も取得しています。

Enterキーを押すたびに新しいテキストエリアを追加できるエディターを作成しています。上記のコードを使用した XY 位置は、すべてのテキスト エリアで常に同じ結果を返します。私のコードを見てください。

import java.awt.Container;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.text.BadLocationException;
import javax.swing.text.JTextComponent;

public class forquestion extends JFrame {

    Container textAreaBox;
    LinkedList<JTextComponent> textArea;
    int nameTA;

    public forquestion() {
            int nameTA = 0;

            textArea = new LinkedList<>();

            textAreaBox = Box.createVerticalBox();
            textAreaBox.add(Box.createVerticalGlue());
            addLine();
            this.add(textAreaBox);
            this.setVisible(true);
    }

    public static void main(String[] args) {
            forquestion app = new forquestion();
            app.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    }

    public void addLine () {

            JTextComponent temp_ta = createTextComponent();
            textArea.add(temp_ta);
            textAreaBox.add(textArea.getLast());
            textAreaBox.add(Box.createVerticalGlue());
    }

    protected JTextComponent createTextComponent() {
            JTextArea ta = new JTextArea("test");

            /*if (count%2==0)
                            ta.setForeground(Color.red);
            else
                            ta.setForeground(Color.GREEN);*/

            ta.setFont(new Font("Courier New",Font.PLAIN,16));
            ta.setLineWrap(true);                                                                                                                                                                                                                                                   
            ta.setWrapStyleWord(true);
            ta.setName(Integer.toString(nameTA));
            nameTA+=1;

            basicKey("ENTER", enter, ta);

            ta.addMouseListener(new java.awt.event.MouseAdapter() {
                    public void mousePressed(java.awt.event.MouseEvent ev) {
                            try {
                                    taMousePressed(ev);
                            } catch (BadLocationException ex) {
                                    Logger.getLogger(forquestion.class.getName()).log(Level.SEVERE, null, ex);
                            }
                    }
            });

            return ta;
    }

    public void basicKey(String s, Action a, JTextArea ta) {

            ta.getInputMap().put(KeyStroke.getKeyStroke(s), s);
            ta.getActionMap().put(s, a);
    }

    Action enter = new AbstractAction() {

            @Override
            public void actionPerformed(ActionEvent e) {

                    addLine();
            }
    };

    private void taMousePressed(java.awt.event.MouseEvent ev) throws BadLocationException {
            int now_focus = Integer.parseInt(ev.getComponent().getName());
            int _caret;
            _caret = textArea.get(now_focus).getCaretPosition();
            Rectangle rectangle = textArea.get(now_focus).modelToView(_caret);
            double x = rectangle.getX();
            //int xc = textArea.get(now_focus).getLocation().x;
            double y = rectangle.getY();
            //int yc = textArea.get(now_focus).getLocation().y;
            //double h = rectangle.getHeight();
            //double w = rectangle.getWidth();
            System.out.println(x);
            System.out.println(y);  
            //System.out.println(xc);
            //System.out.println(yc);  
            //System.out.println(h);
            //System.out.println(w);
            System.out.println("");
    }

}

私のコードは、テキスト領域を押すたびに XY 位置を出力します。ただし、表示は常にすべてのテキスト領域で同じです。(テキストエリアをたくさん作って、テキストを与えてみてください) ところで、これは単純なコードです。エンターキーを押した後、新しいテキストエリアを更新するためにウィンドウフレームのサイズを変更する必要があります..ハハハ。

だから、私の質問は次のとおりです。テキストエリアでキャレット(テキストカーソル)のXY位置を取得するにはどうすればよいですか。そこに JPopmenu を表示したい。:)

この質問があなたにとって明確であることを願っています。前にthx。

4

1 に答える 1

3

報告されたRectangle背面はテキスト領域に相対的であり、0x0 の位置はコンポーネントの左上隅です。

次のようなものを使用すると...

popup.show(textArea.get(now_focus), rectangle.x, rectangle.y + rectangle.height);

はどこにpopupありJPopupMenu、画面自体に必要な翻訳を行います。

今。そうは言っても。個人的には、Swing が提供するポップアップ API サポートを使用することを好みます。これは、それを達成するために拡張するカスタムコンポーネントを作成する必要があることを意味しますJTextArea...

public class MyPopupTextArea extends JTextArea {
    /*...*/
    public Point getPopupLocation(MouseEvent evt) {
        Rectangle rectangle = textArea.get(now_focus).modelToView(_caret);

        Point p = rectangle.getLoction();
        p.y += rectangle.height;

        return p;
    }
}

次に、必要に応じて、setComponentPopupの共有インスタンスを提供するために使用するか、必要に応じて、カスタム エディターの各インスタンスのJPopupMenuカスタムを作成し、必要に応じて使用できます...マウス リスナーをいじることはありません ;)JPopupMenusetComponentPopup

于 2013-09-22T04:47:59.990 に答える