如何只对JTextArea(+ JScrollPane)的下一行进行编辑

时间:2014-10-06 16:52:13

标签: 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());
}

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

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

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

3 个答案:

答案 0 :(得分:1)

执行此操作的方法是使用 DocumentFilter 。这是Java中一个相当模糊和很少使用的部分,并且很容易使用。但是,它允许您在UI(编辑富文本内容)和底层模型(内容)之间插入DocumentFilter。你通过了所有'插入'和'删除'通过过滤器操作,可以接受,拒绝或修改它们。您可以将过滤器编码为仅允许修改命令行,而不允许修改提示。

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

标准Java文档页面中有一个教程,但不是高级教程,我所知道的很少的例子都在网上。

ProtectedTextComponent(感谢camickr)提供了一个如何做类似事情的例子。

答案 1 :(得分:0)

使用Collection a JTextField 让用户在JTextField上输入内容,按下enter后,将控件移至下一个JTextField,同时使上述JTextField不可编辑,并删除{{1} }} 从中。

希望这有帮助。

答案 2 :(得分:0)

我也同意JTextArea / JTextField方法是常见且简单的方法。

但是如果你想让自己的生活稍微复杂一点,那么你可以查看Protected Text Component,它将为你完成大部分逻辑。

ProtectedDocument的当前实现只允许您为Document添加保护,而不是删除它,因此您需要做的第一件事就是添加一个方法来清除"清除"所有保护文本。这很容易,您只需清除类中使用的Map中的条目。

接下来,您需要更换默认"输入" JTextPane使用的操作。您可以通过播放文本区域的Key Bindings来完成此操作。有关基本信息,请参阅Key Bindings。在您的自定义操作中,您首先需要调用新创建的" clear(...)"方法。然后,您将文本添加到文本区域。最后你会保护所有的文字,但最后的" x"字符数。