[英]How do you add both JTextPane and JTextArea to a JScrollPane?
我正在尝试在 java 中制作类似记事本的应用程序。
我想将部分放在带有行号( JTextArea
)和文本部分( JTextPane
)的一侧,并且我想为它们都添加滚动。 这是我现在的程序。
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(-7, -1, 550, 400);
contentPane = new JPanel();
contentPane.setBounds(-7, -1, 550, 400);
setContentPane(contentPane);
contentPane.setLayout(null);
JPanel Pane=new JPanel();
Pane.setLayout(null);
JTextPane txtp = new JTextPane();
txtp.setFont(new Font("Segoe UI", Font.PLAIN, 11));
txtp.setBounds(22, 0, 413, 250);
Pane.add(txtp);
JTextArea header = new JTextArea();
header.setBounds(0, 0, 20, 250);
Pane.add(header);
JScrollPane txt=new JScrollPane(Pane);
txt.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
txt.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
txt.setBounds(0, 0, 437, 250);
txt.getVerticalScrollBar().setOpaque(false);
txt.getHorizontalScrollBar().setOpaque(false);
contentPane.add(txt);
count = new JTextField();
count.setText("Word Count: 0, Character Count: 0");
count.setFont(new Font("Segoe UI", Font.PLAIN, 9));
count.setBounds(0, 250, 439, 13);
contentPane.add(count);
count.setColumns(10);
任何帮助将不胜感激。
我用JTextPane
和JTextArea
创建了一个JFrame
。
如您所见,有行号、文本区域和滚动条。
以下是我创建此 GUI 所采取的步骤。
我通过调用SwingUtilities
invokeLater
方法来启动应用程序。 此方法确保在Event Dispatch Thread上创建和执行 Swing 组件。
我使用Swing 布局管理器。 这是至关重要的。 如果不使用布局管理器,您将无法构建复杂的 Swing GUI。 没门。 不可思议。
JFrame
有一个默认的BorderLayout
。 我将主JPanel
放在中心。 创建状态JPanel
时,可以将该JPanel
放在 AFTER_LAST_LINE 之后。
我创建了一个主JPanel
、一个行号JPanel
和一个文本区域JPanel
。 几乎任何 GUI 都可以分解为多个JPanels
。 一旦你掌握了窍门,你就会到处看到JPanels
。
我以自己的方法创建每个JPanel
。 这是关注点分离。 这使我可以一次专注于 GUI 的一个部分,并允许我尝试使用不同的 Swing 布局管理器来查看哪个布局管理器效果最好。
这是完整的可运行代码。 您可以以此为基础来启动您的应用程序,一次添加一小部分代码并进行测试。 测试,测试,测试。 测试是您学习如何使用 Swing 布局管理器的唯一方法。
我有没有提到 Swing 布局管理器对于创建 GUI 有多重要? 嗯,他们是。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
public class BasicWordProcessor implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new BasicWordProcessor());
}
private int rows;
private Document document;
private JTextArea textArea;
private JTextPane textPane;
public BasicWordProcessor() {
this.rows = 15;
this.document = new PlainDocument();
}
@Override
public void run() {
JFrame frame = new JFrame("Basic Word Processor");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createMainPanel(), BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createMainPanel() {
JPanel panel = new JPanel(new BorderLayout());
JPanel innerPanel = new JPanel(new BorderLayout());
innerPanel.add(createLineNumberPanel(),
BorderLayout.BEFORE_LINE_BEGINS);
innerPanel.add(createTextAreaPanel(), BorderLayout.CENTER);
JScrollPane scrollPane = new JScrollPane(innerPanel);
Dimension d = innerPanel.getPreferredSize();
d.width += 30;
panel.setPreferredSize(d);
panel.add(scrollPane, BorderLayout.CENTER);
return panel;
}
private JPanel createLineNumberPanel() {
JPanel panel = new JPanel(new FlowLayout());
textPane = new JTextPane();
textPane.setEditable(false);
createRowText();
panel.add(textPane);
return panel;
}
private void createRowText() {
int length = Integer.toString(rows).length();
String formatter = "%0" + length + "d";
StringBuilder builder = new StringBuilder();
for (int i = 1; i <= rows; i++) {
String s = String.format(formatter, i);
builder.append(s).append(System.lineSeparator());
}
textPane.setText(builder.toString());
}
private JPanel createTextAreaPanel() {
JPanel panel = new JPanel(new FlowLayout());
textArea = new JTextArea(document, "", rows, 60);
document.addDocumentListener(new MyDocumentListener());
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
panel.add(textArea);
return panel;
}
public class MyDocumentListener implements DocumentListener {
@Override
public void insertUpdate(DocumentEvent event) {
rows = textArea.getLineCount();
createRowText();
}
@Override
public void removeUpdate(DocumentEvent event) {
rows = textArea.getLineCount();
createRowText();
}
@Override
public void changedUpdate(DocumentEvent event) {
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.