Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何仅使JTextArea(+;JScrollPane)的下一行可编辑_Java_Swing_Jscrollpane_Jtextarea - Fatal编程技术网

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

Java 如何仅使JTextArea(+;JScrollPane)的下一行可编辑,java,swing,jscrollpane,jtextarea,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.setResiz

因此,我正在创建一个服务器,这非常有效,但是我在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()+"       > ", "");
    }
});
也许是那样的?
然后我需要它,以便只有“>”后面的部分是可编辑的?

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

正如我所说的,这是一个相当困难的编码过程,文档/文档过滤器结构有很多您的特定应用程序不需要的复杂性。然而,它确实为您提供了所需的设施

在标准的Javadoc页面中有一个教程,但不是高级教程,我所知道的很少有示例出现在web上


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

使用
集合
a
JTextField

让用户在
JTextField
上键入,一旦按下
enter
,将控件移动到下一个
JTextField
,同时使上述
JTextField
不可编辑,并从中删除
JScrollPane


希望这能有所帮助。

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

然而,如果你想让你的生活复杂一点,那么你可以看看哪一个对你来说最符合逻辑

当前实施的
ProtectedDocument
只允许您向文档添加保护,而不允许删除它,因此您需要做的第一件事是添加一个方法来“清除”所有受保护的文本。这很简单,只需清除类使用的映射中的条目


接下来,您需要替换JTextPane使用的默认“Enter”操作。您可以通过使用文本区域的
键绑定来实现这一点。有关一些基本信息,请参阅。在自定义操作中,首先需要调用新创建的“clear(…)”方法。然后将文本添加到文本区域。最后,您将保护所有文本,但最后的“x”个字符除外。

在JTextArea下面使用JTextField。但是,虽然这更容易,但这并不是我真正想要的。这不是您想要的吗?除非我遗漏了一些要求,否则这正是你想要的。这是解决这个问题的标准方法。请注意,如果您担心的话,您可以修改文本组件的边框和其他内容,使它们看起来像一个组件。事实上,我想您是对的,我只是认为在JTextArea本身会有一种方法。Thx.只需处理JTextArea中的事件,不允许对现有文本进行任何更改。这应该很简单。
这是一个相当难的编码过程
-我同意:)如果您感兴趣,您可以查看哪个类为您处理此问题。@camickr这是一个很好的类,可以简化很多事情。介意我把它纳入我的答案吗?正如我在回答中所说的,你将不能按原样使用课堂,但可以自由地玩、定制和实验。