Java 获取JTextArea中插入符号位置的XY位置
事实上,我已经问过这个问题了。但是,我错了。我还没有找到解决办法 首先,在前面的问题中,我可以用Java 获取JTextArea中插入符号位置的XY位置,java,swing,position,jtextarea,caret,Java,Swing,Position,Jtextarea,Caret,事实上,我已经问过这个问题了。但是,我错了。我还没有找到解决办法 首先,在前面的问题中,我可以用 Rectangle rectangle = textArea.modelToView( textArea.getCaretPostion() ); 我也得到了X和Y的位置 我正在创建一个编辑器,每次按Enter键都可以添加新的文本区域。带有上述代码的XY位置始终在每个文本区域中给出相同的返回值。看看我的代码 import java.awt.Container; import java.awt.Fo
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("");
}
}
导入java.awt.Container;
导入java.awt.Font;
导入java.awt.Rectangle;
导入java.awt.event.ActionEvent;
导入java.awt.event.KeyEvent;
导入java.util.LinkedList;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.swing.AbstractAction;
导入javax.swing.Action;
导入javax.swing.Box;
导入javax.swing.JFrame;
导入javax.swing.JTextArea;
导入javax.swing.KeyStroke;
导入javax.swing.text.BadLocationException;
导入javax.swing.text.JTextComponent;
公共类forquestion扩展了JFrame{
容器文本框;
LinkedList文本区;
int nameTA;
公共问题{
int nameTA=0;
textArea=newlinkedlist();
textAreaBox=Box.createVerticalBox();
添加(Box.createVerticalGlue());
addLine();
添加(文本区域框);
此.setVisible(true);
}
公共静态void main(字符串[]args){
forquestion应用程序=新建forquestion();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
公共无效添加行(){
JTextComponent temp_ta=createTextComponent();
textArea.add(温度);
添加(textArea.getLast());
添加(Box.createVerticalGlue());
}
受保护的JTextComponent createTextComponent(){
JTextArea ta=新的JTextArea(“测试”);
/*如果(计数%2==0)
设置前景(颜色为红色);
其他的
设置前景(颜色为绿色)*/
ta.setFont(新字体(“Courier new”,普通字体,16));
ta.setLineWrap(真);
ta.setWrapStyleWord(真);
setName(Integer.toString(nameTA));
nameTA+=1;
basicKey(“回车”,回车,ta);
ta.addMouseListener(新java.awt.event.MouseAdapter(){
public void mousePressed(java.awt.event.MouseEvent ev){
试一试{
tamouse(ev);
}捕获(BadLocationException ex){
Logger.getLogger(forquestion.class.getName()).log(Level.SEVERE,null,ex);
}
}
});
返回ta;
}
公共无效basicKey(字符串s,动作a,JTextArea ta){
ta.getInputMap().put(击键.getKeyStroke,s);
ta.getActionMap().put(s,a);
}
Action enter=new AbstractAction(){
@凌驾
已执行的公共无效操作(操作事件e){
addLine();
}
};
私有void taMousePressed(java.awt.event.MouseEvent ev)引发BadLocationException{
int now_focus=Integer.parseInt(ev.getComponent().getName());
插入符号;
_caret=textArea.get(现在是焦点).getCaretPosition();
矩形=textArea.get(现在是焦点).modelToView(\u插入符号);
double x=rectangle.getX();
//int xc=textArea.get(现在是焦点).getLocation().x;
双y=rectangle.getY();
//int yc=textArea.get(现在是焦点).getLocation().y;
//双h=矩形。getHeight();
//double w=rectangle.getWidth();
系统输出println(x);
系统输出打印项次(y);
//系统输出打印项次(xc);
//系统输出打印项次(yc);
//系统输出打印ln(h);
//系统输出打印LN(w);
System.out.println(“”);
}
}
每次按下文本区域时,我的代码将打印XY位置。但是,每个文本区域中的显示始终相同。(试着制作多个文本区域并给出一些文本)顺便说一句,这只是简单的代码。按enter键后,您需要更改窗口框架大小以更新新的文本区域..哈哈哈
所以,我的问题是:如何获得任何文本区域中插入符号(文本光标)的XY位置。我想在那里显示JPopmenu:)
我希望你明白这个问题。Thx before.返回的
矩形
相对于文本区域,其中0x0位置是组件的左上角
如果你使用像
popup.show(textArea.get(now_focus), rectangle.x, rectangle.y + rectangle.height);
如果popup
是jpopmpmenu
,它将对屏幕本身进行所需的翻译
现在。话虽如此。就我个人而言,我更喜欢使用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
来提供jpopMenu
的共享实例,或者,如果需要,为自定义编辑器的每个实例创建一个自定义jpopMenu
,并根据需要使用setComponentPopup
,不要乱动鼠标侦听器;) 我明白了。谢谢。顺便说一句,你能给我你的问题的完整代码吗?至少,您的构造函数或将Jpopmenu添加到面板或框架的代码。我还在学习JPopMenu。每次我将它添加到容器中,它都会覆盖其他组件。您不会将JPopupMenu添加到组件中(通常)。您应该使用setComponentPopup将弹出窗口与组件相关联,或者,如果