JTextPane - 自动换行插入JLabel组件

时间:2016-04-18 14:26:35

标签: java swing user-interface jtextpane

我有JTextPane,我插入了20个组件(JLabels)。不幸的是,所有标签都在一行上。

如何强制JTextPane会自动换行插入的对象?

enter image description here

package texteditor;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;

public class JTextPaneExample extends JPanel {

    private JTextPane tp;

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

        JPanel panel = new JPanel();
        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);

        for (int i = 0; i < 20; i++) {
            JLabel lbl = new JLabel("AAAA ");
            lbl.setOpaque(true);
            lbl.setBorder(BorderFactory.createLineBorder(Color.black, 1));
            tp.insertComponent(lbl);
        }
    }


    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 个答案:

答案 0 :(得分:2)

JTextPane包装空格。您的文档没有任何空格,因此没有任何内容可以包装。您可以在标签之间添加空格:

for (int i = 0; i < 20; i++) {
    JLabel lbl = new JLabel("AAAA ");
    lbl.setOpaque(true);
    lbl.setBorder(BorderFactory.createLineBorder(Color.black, 1));
    tp.insertComponent(lbl);
    doc.insertString(doc.getLength(), " ", null);
    tp.setCaretPosition(doc.getLength());
}

另外,仍然不确定为什么要使用JTextPane。您可以使用JPanel并将面板上的组件换行到下一行。有关使用此方法的解决方案,请参阅Wrap Layout

这也应该使您上一个问题(JTextPane - get component values)的解决方案更容易,因为您将处理不需要搜索文档以获取点击标签的实际组件。

答案 1 :(得分:1)

你需要使用LayoutManager,在这种情况下,你可能想要/必须建立你自己的LayoutManager(我必须在几年前为类似的问题做这件事)。在LayoutManager layoutComponent方法中,检查标签的索引以及之前所有组件的所有preferredsize.width / size.width的长度。如果这大于您的JTextPane preferredsize.width / size.width,请将其移至下一行。