2012-02-11 33 views
3

我有一个JTextArea,正在检测是否有任何文本是选择的,如果没有,那么两个菜单项都是灰色的。我遇到的问题是,当我编译并打开应用程序时,我必须先点击JTextArea,然后菜单项变灰,如果我不是他们不是,即使没有选择文本。我正在使用以下脱字符侦听器。在JTextArea中检测文本选择

textArea.addCaretListener(new CaretListener() { 

     @Override 
     public void caretUpdate(CaretEvent arg0) { 
      int dot = arg0.getDot(); 
      int mark = arg0.getMark(); 
      if (dot == mark) { 

       copy2.setEnabled(false); 
       cut1.setEnabled(false); 
      } 
      else{ 
       cut1.setEnabled(true); 
       copy2.setEnabled(true); 
      } 

     } 
    }); 

回答

5

您应该setEnabled(false)每个当你创建它们其中的菜单项。

+0

这有用,有没有更好的方法? (对我来说,这似乎有点俗气,但它可能只是我)。 – orange 2012-02-11 18:15:43

+1

@Jeff - 想想这样:选择是一个积极的行动,使菜单项。当您启动应用程序时,尚未进行选择,因此这些项目应处于默认状态。哪些是禁用的。 – kdgregory 2012-02-11 18:29:08

1

您可以在单独的函数中为切割/复制菜单项定义启用/禁用逻辑,并在初始化GUI时调用该函数,并且该函数将在CaretUpdate(或更好地为MouseReleased)事件上调用。

JTextArea textArea; 
...... 
........ 
public void init() 
{ 
    ...... 
    ........ 
    textArea=new JTextArea(); 
    // add textArea to parent container 
    // now initialize menu items state 
    setEditingMenuItemsState(); 
    textArea.addCaretListener(new CaretListener() 
    { 
     @Override 
     public void caretUpdate(CaretEvent arg0) 
     { 
      setEditingMenuItemsState(); 
     } 
    }); 
    ...... 
    ........ 
} 

public void setEditingMenuItemsState() 
{ 
    String selectedText; 

    if (textArea == null) selectedText = null; 

    if (selectedText == null || selectedText.isEmpty()) 
    { 
     copy2.setEnabled(false); 
     cut1.setEnabled(false); 
    } 

    else 
    { 
     cut1.setEnabled(true); 
     copy2.setEnabled(true); 
    } 
} 
-1

您可以使用 JtextField.setHighlighter(NULL);

+0

这将删除所有被选中的视觉线索。 – kleopatra 2013-01-24 12:41:06