[英]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.