java - 如何仅使 JTextArea (+JScrollPane) 的下一行可编辑

标签 java swing jscrollpane jtextarea

所以我创建了一个服务器,效果很好,但是我有点卡在 GUI 上。你看,我希望它看起来就像命令提示符一样,其中只有下一行是可编辑的,并且它不允许您删除任何其他文本。所以现在我有:

JTextArea ta = new JTextArea();
JScrollPane sp = new JScrollPane(ta);

然后是框架的东西......

    f.setTitle("Server");
    f.setBounds(ss.width - 600, 50, 550, 350);
    f.setResizable(false);
    f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//added window listener so closes socket connection first
    f.setAlwaysOnTop(true);

然后添加它:

    f.add(sc);
    jt.setBackground(Color.BLACK);
    jt.setForeground(Color.WHITE);
    //jt.setEditable(false);

最后,我用来输出到TextArea的方法:

public static void append(String text) {
    jt.append(text);
    jt.append("\n\n"+System.getProperty("user.name")+" / "+getIp()+" > ");
    jt.setCaretPosition(jt.getDocument().getLength());
}

现在我需要为用户按 Enter 键后在 JTextArea 中输入的内容分配一个字符串:>?

jt.addActionListener(...{
    public void ActioEvent(ActionEvent e){
        String text = JTextArea.getLines().getLastLine().getText().replace(System.getProperty("user.name")+" / "+getIp()+"       > ", "");
    }
});

也许是这样的? 那么我需要拥有它,以便只有“>”之后的部分是可编辑的?

最佳答案

执行此操作的方法是使用 DocumentFilter 。这是 Java 中相当晦涩且很少使用的部分,并且远非易于使用。但是,它允许您在 UI(编辑富文本内容的地方)和底层模型(内容)之间插入 DocumentFilter。您通过过滤器传递所有“插入”和“删除”操作,过滤器可以接受、拒绝或修改它们。您可以对过滤器进行编码,使其仅允许修改命令行,而不允许修改提示符。

正如我所说,这是一段相当困难的编码,并且 Document/DocumentFilter 结构具有很多复杂性,您的特定应用程序不需要。不过,它确实为您提供了所需的设施。

标准 Java 文档页面中有一个教程,但没有高级教程,而且据我所知,网络上的示例很少。

ProtectedTextComponent (感谢 camickr)提供了如何执行类似操作的示例。

关于java - 如何仅使 JTextArea (+JScrollPane) 的下一行可编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26220988/

相关文章:

java - Lucene 4.x性能问题

java - mongoDB中_id如何聚合由两个元素组成(在Java中)?

java - 为什么 bean 验证 Min/Max 约束不支持 double 类型?

java - 获取用户在其他类中输入的文本

java - 如何在 JScrollPane 中立即显示滚动条

java - 更改 JComboboxBox 上的 JScrollPane

java - JIT 编译代码存放在哪里?

java - 我想重置/重新加载 JFrame,以便所有字段都设置回默认值

java - 计算 "nice"在 JSplitPane 中查找分隔符的位置

java - scrollRectToVisible 不会将滚动 Pane 移动到顶部