2016-04-16 39 views
1

我有JTextPane,其中插入了2個JLabels。如果有任何標籤被點擊,它們會將內容從AAA更改爲單擊。JTextPane - 獲取組件值

此代碼遍歷在JTextPane中的元素:

 for(int i = 0; i < tp.getDocument().getLength(); i++) { 
      System.out.println(((StyledDocument) tp.getDocument()).getCharacterElement(i)); 
     } 

我怎樣才能訪問標籤打印「點擊」「AAAA」的性病嗎?

enter image description here

package texteditor; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.BorderFactory; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.JPopupMenu; 
import javax.swing.JScrollPane; 
import javax.swing.JTextPane; 
import javax.swing.border.BevelBorder; 
import javax.swing.border.TitledBorder; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.StyledDocument; 
import javax.swing.JButton; 

public class JTextPaneExample extends JPanel { 

    private JTextPane tp; 

    public JTextPaneExample() { 
     setLayout(new BorderLayout(0, 0)); 

     JPanel panel = new JPanel(); 
     panel.setBorder(new TitledBorder(null, "Text Content", TitledBorder.LEADING, TitledBorder.TOP, null, null)); 
     add(panel, BorderLayout.CENTER); 
     panel.setLayout(new BorderLayout(0, 0)); 

     JScrollPane scrollPane = new JScrollPane(); 
     panel.add(scrollPane, BorderLayout.CENTER); 

     tp = new JTextPane(); 
     tp.setEditable(false); 
     scrollPane.setViewportView(tp); 

     JLabel lbl = new JLabel("AAAA "); 
     lbl.setOpaque(true); 
     lbl.setBorder(BorderFactory.createLineBorder(Color.black, 1)); 
     lbl.addMouseListener(new LabelAdapter2(lbl)); 
     tp.insertComponent(lbl); 

     lbl = new JLabel("BBBB "); 
     lbl.setOpaque(true); 
     lbl.setBorder(BorderFactory.createLineBorder(Color.black, 1)); 
     lbl.addMouseListener(new LabelAdapter2(lbl)); 
     tp.insertComponent(lbl); 

     JButton btnNewButton = new JButton("Write content"); 
     btnNewButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       iterateOverContent(tp); 
      } 
     }); 
     panel.add(btnNewButton, BorderLayout.SOUTH); 
    } 

    private void iterateOverContent(JTextPane tp2) { 
      for(int i = 0; i < tp.getDocument().getLength(); i++) { 
       System.out.println(((StyledDocument) tp.getDocument()).getCharacterElement(i)); 
      } 
    } 

    private class LabelAdapter2 extends MouseAdapter { 
     private JLabel lblNewLabel; 

     public LabelAdapter2(JLabel lbl) { 
      this.lblNewLabel = lbl; 
     } 


     public void mouseClicked(MouseEvent evt) { 
      lblNewLabel.setText("clicked"); 
     } 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("GoBoard"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new JTextPaneExample()); 
     frame.setPreferredSize(new Dimension(400, 400)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

回答

2

我看着你的問題,並找到了一個解決方案:

只需更換你的方法與此有關迭代TextPane的元素:

private void iterateOverContent(JTextPane tp2) { 
     for(int i = 0; i < tp.getDocument().getLength(); i++) { 
      Element elem = ((StyledDocument) tp.getDocument()).getCharacterElement(i); 
      AttributeSet as = elem.getAttributes(); 
      if (as.containsAttribute(AbstractDocument.ElementNameAttribute, StyleConstants.ComponentElementName)) { 
       if(StyleConstants.getComponent(as) instanceof JLabel) { 
        JLabel myLabel = (JLabel)StyleConstants.getComponent(as); 
        System.out.println(myLabel.getText()); 
       } 
      } 
      System.out.println(((StyledDocument) tp.getDocument()).getCharacterElement(i)); 
     } 
} 

你可以看到,我首先將元素保存到一個新的變量中,然後讀出所有的屬性(是的,代碼可能會更短,但是這個方式更清楚 - 我希望:-)) 之後,我們檢查屬性是否說,這個元素是一個組件。

然後重要的部分:我們可以通過StyleConstants.getComponent方法從屬性集中獲取Component。

最後只是一些理智檢查,看看我們是否真的可以將它轉換爲JLabel。

此致敬禮, 大衛