gpt4 book ai didi

java - 使 JTextPane 中的 JLable 不可删除

转载 作者:行者123 更新时间:2023-12-01 07:52:13 26 4
gpt4 key购买 nike

我目前有一个 JLabel 嵌入在 JTextPane 中,使用以下方法:

import javax.swing.*;
import javax.swing.text.*;

public class MainFrame
{
JFrame mainFrame = new JFrame("Main Frame");
JTextPane textPane = new JTextPane();

public MainFrame()
{
String[] components = {"Title", "\n"};
String[] styles = {"LABEL_ALIGN", "LEFT_ALIGN"};

StyledDocument sd = textPane.getStyledDocument();
Style DEFAULT_STYLE = StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);

Style LEFT_STYLE = sd.addStyle("LEFT_ALIGN", DEFAULT_STYLE);
StyleConstants.setAlignment(LEFT_STYLE, StyleConstants.ALIGN_LEFT);

Style CENTER_STYLE = sd.addStyle("CENTER_ALIGN", DEFAULT_STYLE);
StyleConstants.setAlignment(CENTER_STYLE, StyleConstants.ALIGN_CENTER);

JLabel titleLbl = new JLabel("Title");
Style LABEL_STYLE = sd.addStyle("LABEL_ALIGN", DEFAULT_STYLE);
StyleConstants.setAlignment(LABEL_STYLE, StyleConstants.ALIGN_CENTER);
StyleConstants.setComponent(LABEL_STYLE, titleLbl);

for(int i = 0; i < components.length; i++)
{
try
{
sd.insertString(sd.getLength(), components[i], sd.getStyle(styles[i]));
sd.setLogicalStyle(sd.getLength(), sd.getStyle(styles[i]));
}
catch(BadLocationException e)
{
e.printStackTrace();
}
}

mainFrame.add(textPane);
mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
mainFrame.setLocationRelativeTo(null);
mainFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
mainFrame.pack();
mainFrame.setVisible(true);
}

public static void main(String[] args)
{
SwingUtilities.invokeLater(MainFrame::new);
}
}

如何使标签不可删除?因为每当我按住退格键时,标签最终都会从 JTextPane

中删除

最佳答案

您也许可以使用 NavigationFilter 来防止删除文本 Pane 开头的组件。查看:How to make part of a JTextField uneditable有关此方法的示例。在本例中,标签代表单个字符,因此前缀长度将设置为 1。或者您可以只使用前缀概念本身,甚至不使用 JLabel。

否则,您也许可以创建自定义DocumentFilter。查看 Swing 教程中关于 Implementing a DocumentFilter 的部分了解基础知识。

因此您需要跟踪组件位置的偏移量。然后,在过滤器的 remove(...) 方法中,您需要检查是否要删除偏移量范围内的数据。如果是这样,您将忽略删除。

当然,如果您在标签之前添加或删除文本,则偏移量可以动态更改,因此您也需要对其进行管理。

或者您可以查看 Protected Text Component它试图为您管理所有这些。

关于java - 使 JTextPane 中的 JLable 不可删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35371113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com