JTextPane-获取组件值 [英] JTextPane - get component values

查看:188
本文介绍了JTextPane-获取组件值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有JTextPane,在其中插入了2个JLabel.如果单击了任何标签,它们会将内容从AAA更改为被单击.

I have JTextPane, where are inserted 2 JLabels. If any of the labels are clicked, they change content from AAA to clicked.

此代码遍历JTextPane中的元素:

This code iterates over the elements in the JTextPane:

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

如何访问标签以将单击的""AAAA"打印到标准输出?

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);
    }
}

推荐答案

我调查了您的问题并找到了解决方案:

i looked into your Question and found a Solution:

只需替换您的方法即可使用以下方法迭代TextPane的元素:

just replace your method to iterate the elements of the TextPane with this:

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));
        }
}

如您所见,

我首先将元素保存到新变量中,然后读出所有属性(是的,代码可能会短很多,但是这样更清楚了-我希望:-)) 之后,我们检查属性是否说这个元素是一个组件.

as you can see, i first save the element into a new variable and then read out all the attributes (yes, the code could be alot shorter, but this way it is more clear - i hope :-) ) After that, we check if the attributes say, that this element is a component.

然后是重要的部分:我们可以通过StyleConstants.getComponent方法从属性集中获取一个Component.

then the important part: we can get a Component from the attribute set via the StyleConstants.getComponent Method.

最后,只需进行一些完整性检查,看看我们是否真的可以将其转换为JLabel.

Finally just some sanity checks, to see if we can really typecast it to a JLabel.

最诚挚的问候, 大卫

这篇关于JTextPane-获取组件值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆