JTextPane - 自动换行插入的 JLabel 组件
JTextPane - auto wrap inserted JLabel components
我在 JTextPane 中插入了 20 个组件 (JLabel)。不幸的是,所有标签都在一行上。
如何强制 JTextPane 自动包装插入的对象?
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);
}
}
您需要使用 LayoutManager
,在这种情况下,您可能想要/必须构建自己的 LayoutManager(几年前我不得不为类似的问题这样做)。在您的 LayoutManager layoutComponent 方法中,检查标签的索引以及之前所有组件的所有 preferredsize.width / size.width 的长度。如果这大于您的 JTextPane preferredsize.width / size.width,请将其移至下一行。
JTextPane 在 space 上换行。您的文档没有任何 space,因此没有任何东西可以包装。您可以在标签之间添加一个space:
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 中插入了 20 个组件 (JLabel)。不幸的是,所有标签都在一行上。
如何强制 JTextPane 自动包装插入的对象?
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);
}
}
您需要使用 LayoutManager
,在这种情况下,您可能想要/必须构建自己的 LayoutManager(几年前我不得不为类似的问题这样做)。在您的 LayoutManager layoutComponent 方法中,检查标签的索引以及之前所有组件的所有 preferredsize.width / size.width 的长度。如果这大于您的 JTextPane preferredsize.width / size.width,请将其移至下一行。
JTextPane 在 space 上换行。您的文档没有任何 space,因此没有任何东西可以包装。您可以在标签之间添加一个space:
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。
这也应该使您上一个问题 (