【问题标题】:JTabbedPane dynamically tabsJTabbedPane 动态选项卡
【发布时间】:2017-03-09 02:28:51
【问题描述】:

我正在创建一种记事本,它有一个用于行计数器的窗格,它告诉我行的位置(当我按 Enter 时它会增加)和另一个用于行和列计数器的窗格(就像 Notepad++ 一样)。我想动态添加标签,所以每次我选择“新建”选项时,都会创建一个新标签。默认情况下,我的记事本从打开一个选项卡开始,就像 Notepad++ 一样。让我们将此选项卡称为 TAB1

  • 如果我按“新建”,它将创建一个新选项卡,我们称之为 TAB2。现在我们有了 TAB1 和 TAB2
  • 如果我再次按“新建”,它将创建一个新选项卡,我们称之为 TAB3,所以我现在将有 3 个选项卡:TAB1、TAB2、TAB3。

现在,如果我想选择 TAB2 来编辑其中的内容,这是我的程序无法正常工作的地方,因为如果我想按 Enter 进入新行,它不会在 TAB2 中添加新行,它将在 TAB3 中添加一个新行。我该如何解决这个问题?

这里是 ActionListener ,我在这里说如果我从菜单栏中按“新建”会发生什么。 state() 是我进行布局的函数。

if(menuFileNew == e.getSource())
    {   
        state();        
            Action newline = new AbstractAction() 
            {
               public void actionPerformed(ActionEvent e) 
               {
                    thisTextArea.setText(thisTextArea.getText()+"\n");
                   counter++;
                thisLineCounterPane.setText(thisLineCounterPane.getText()+counter+"\n");            
               }
            }; 
        thisTextArea.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), NEWLINE);
        thisTextArea.getActionMap().put(NEWLINE, newline);
    }

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖minimal reproducible exampleShort, Self Contained, Correct Example
  • 也许是一个“白痴”问题,但是每个选项卡都有一个 JTextArea 实例吗?
  • 我有 2 个 textArea 实例。 1 用于第一个选项卡,另一个用于我将添加的任何选项卡。由于我想以动态方式进行操作,因此我不知道如何创建单独的 textAreas。不是“白痴”问题,不用担心。

标签: java swing jtabbedpane


【解决方案1】:
thisTextArea.setText(thisTextArea.getText()+"\n");

你的“换行”动作不正确。您正在对要更改的文本区域变量进行硬编码。

相反,您的 Action 应该扩展 TextAction(而不是 AbstractAction)。然后可以使用TextActiongetFocusedComponent()方法获取当前有焦点的文本区域。

查看简单示例:Clear current FocusOwner (jTextfield)

另外,这不是向文本字段添加换行符的方法。不要使用 setText() 方法。相反,您应该使用 append(...) 方法。

尽管真正的问题是您为什么要创建此操作?向文本区域添加换行符是按 Enter 键时的默认行为。

【讨论】:

  • 行计数器和行&列计数器需要它。我一直在尝试不绑定键,它没有用.. 谢谢你的回答,它现在可以工作了!
  • @ClaudiuM, I needed it for line counter - 如果删除了一行文本会怎样。您应该使用DocumentListener 来监听文档中文本的更改。 ...and line&column counter - 您应该使用CaretListener 来收听文本中插入符号的移动。在这两种情况下,您都可以使用Text Utilities 获取有关行数和行/列位置的信息。
  • 对于line&column,确实我使用了CaretListener,但是对于line counter,我不知道DocumentListener。 DocumentListener 会在我按 Enter 和 Backspace 时自动增加和减少行数?
  • @ClaudiuM,您不能依靠“Enter”和“Backspace”来保持行数。如果有人将文本粘贴到文本区域怎么办?如果有人选择一个文本块并删除它会发生什么? DocumentListener 只是告诉您何时进行更改,然后您必须计算当前行数,这就是我给您Text Utilities 链接的原因。
  • 我正在使用你的文本组件行号,我添加了你的组件,我可以编译我的程序并计算我的行数,但是当我在 Eclipse 中打开设计时,我会报错“ WindowBuilder 无法显示 GUI”。我该怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 2015-12-20
  • 2014-06-19
  • 1970-01-01
  • 2010-12-19
相关资源
最近更新 更多