2016-02-12 62 views
0

我现在有一个JLabel嵌入在使用本JTextPane制作JLable中的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

+0

我们可以得到一个MCVE吗? –

+1

@JeremyBarnes完成 – Jonah

回答

5

你也许能够使用NavigationFilter,以防止在文本窗格开始移除的组件。查看:How to make part of a JTextField uneditable查看此方法的示例。在这种情况下,标签表示单个字符,因此前缀长度将设置为1.或者,您可以只使用前缀概念本身,甚至不使用JLabel。

否则,你也许可以创建自定义DocumentFilter。查看Implementing a DocumentFilter的Swing教程中的基础部分。

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

当然偏移,如果你在标签前添加或删除文本可以动态改变,所以你需要以管理为好。

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

+0

谢谢。 :)得到它使用DocumentFilter工作。 – Jonah

1

越来越除去为什么不干脆把你的标题标签的文本区域之外?这似乎更直观。

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

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

+0

当退格被保留时,组件仍然从文本窗格中被删除 – Jonah

+0

发布更多代码。如果你给我一些可以运行的东西,我可以看到最新消息,但我不打算在这里自己制作一个应用程序。 –

+1

完整MCVE发帖 – Jonah