2016-02-12 34 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