0

我目前有一个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

4

2 回答 2

5

您可能可以使用 aNavigationFilter来防止删除文本窗格开头的组件。查看:如何使 JTextField 的一部分不可编辑以获取此方法的示例。在这种情况下,标签表示单个字符,因此前缀长度将设置为 1。或者您可以只使用前缀概念本身,甚至不使用 JLabel。

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

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

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

或者,您可以查看受保护的文本组件,它会尝试为您管理所有这些。

于 2016-02-12T21:54:07.120 回答
1

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

看起来没有真正的方法可以避免这种情况,同时仍然允许 textarea 是可编辑的。您可以将标签放置在文本框上方,使其占据相同的空间,或者将标签放置在文本框上方,使其表现得像一个正确的标题。

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

于 2016-02-12T20:49:28.423 回答