У меня есть 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);
    }
}
1
Radim Burget 18 Апр 2016 в 17:26

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 - получить значения компонентов), поскольку вы будет иметь дело с реальными компонентами, вам не нужно будет искать в документе, чтобы получить метку, по которой щелкнули мышью.

2
Community 23 Май 2017 в 11:59

Вам нужно использовать LayoutManager, и в этом случае вы можете захотеть / должны создать свой собственный LayoutManager (мне пришлось сделать это из-за аналогичной проблемы много лет назад). В своем методе LayoutManager layoutComponent проверьте индекс метки и длину всех предпочитаемых размеров.ширина / размер.ширина всех компонентов перед этим. Если это больше, чем ваш JTextPane preferredsize.width / size.width, переместите его на следующую строку.

1
ControlAltDel 18 Апр 2016 в 14:33