Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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 使JTextPane中的JLable不可删除_Java_Swing_Jtextpane_Styleddocument - Fatal编程技术网

Java 使JTextPane中的JLable不可删除

Java 使JTextPane中的JLable不可删除,java,swing,jtextpane,styleddocument,Java,Swing,Jtextpane,Styleddocument,我目前有一个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[] com

我目前有一个
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);
    }
}
import javax.swing.*;
导入javax.swing.text.*;
公共类主机
{
JFrame mainFrame=新的JFrame(“主框架”);
JTextPane textPane=新的JTextPane();
公共主机()
{
字符串[]组件={“标题”,“\n”};
字符串[]样式={“标签对齐”,“左对齐”};
StyledDocument sd=textPane.getStyledDocument();
Style DEFAULT\u Style=StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT\u Style);
Style LEFT\u Style=sd.addStyle(“LEFT\u ALIGN”,默认\u样式);
setAlignment(LEFT_样式,StyleConstants.ALIGN_LEFT);
样式中心样式=sd.addStyle(“中心对齐”,默认样式);
setAlignment(居中\u样式,StyleConstants.ALIGN\u居中);
JLabel titleLbl=新JLabel(“标题”);
样式LABEL\u Style=sd.addStyle(“LABEL\u ALIGN”,默认样式);
StyleConstants.setAlignment(标签样式、StyleConstants.ALIGN\u中心);
setComponent(标签样式,标题bl);
对于(int i=0;i

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

中删除,为什么不将标题标签放在文本区域之外呢?这似乎更直观

看起来没有真正的方法可以避免这种情况,同时仍然允许文本区域可编辑。可以将标签放置在文本框上方,使其占据相同的空间,也可以将标签放置在文本框上方,使其行为类似于正确的标题


不幸的是,textarea的本质是它的所有子组件都是可编辑的,或者它们都不可编辑。

为什么不将您的标题标签放在文本区域之外呢?这似乎更直观

看起来没有真正的方法可以避免这种情况,同时仍然允许文本区域可编辑。可以将标签放置在文本框上方,使其占据相同的空间,也可以将标签放置在文本框上方,使其行为类似于正确的标题


不幸的是,textarea的本质是它的所有子组件都是可编辑的,或者没有一个是可编辑的。

您可以使用
导航过滤器来阻止删除文本窗格开头的组件。查看:查看此方法的一个示例。在这种情况下,标签表示单个字符,因此前缀长度将设置为1。或者,您可以只使用前缀概念本身,而不使用JLabel

否则,您可能可以创建自定义的
DocumentFilter
。查看上的Swing教程中的部分了解基本知识

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

当然,如果在标签之前添加或删除文本,偏移量可能会动态变化,因此也需要对其进行管理


或者,您可以查看尝试为您管理所有这些内容的。

您可以使用
导航筛选器
来防止删除文本窗格开头的组件。查看:查看此方法的一个示例。在这种情况下,标签表示单个字符,因此前缀长度将设置为1。或者,您可以只使用前缀概念本身,而不使用JLabel

否则,您可能可以创建自定义的
DocumentFilter
。查看上的Swing教程中的部分了解基本知识

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

当然,如果在标签之前添加或删除文本,偏移量可能会动态变化,因此也需要对其进行管理


或者,您可以查看尝试为您管理所有这些内容的。

我们可以获得MCVE吗?我们可以获得MCVE吗?当backspace被取消时,该组件仍然会从文本窗格中删除。您的大部分代码都会使用backspace。如果你给我一些可运行的东西,我可以看到有什么问题,但我不会在这里自己制作一个swing应用程序。当backspace被删除时,该组件仍然会从文本窗格中删除,因为你的代码大部分都是backspace。如果你给我一些可以运行的东西,我可以看到是怎么回事,但我不会在这里自己做一个swing应用程序。