簡體   English   中英

如何將 JTextPane 和 JTextArea 添加到 JScrollPane?

[英]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);

任何幫助將不勝感激。

我用JTextPaneJTextArea創建了一個JFrame

基本字處理器 GUI

如您所見,有行號、文本區域和滾動條。

以下是我創建此 GUI 所采取的步驟。

  1. 我通過調用SwingUtilities invokeLater方法來啟動應用程序。 此方法確保在Event Dispatch Thread上創建和執行 Swing 組件。

  2. 我使用Swing 布局管理器 這是至關重要的。 如果不使用布局管理器,您將無法構建復雜的 Swing GUI。 沒門。 不可思議。

  3. JFrame有一個默認的BorderLayout 我將主JPanel放在中心。 創建狀態JPanel時,可以將該JPanel放在 AFTER_LAST_LINE 之后。

  4. 我創建了一個主JPanel 、一個行號JPanel和一個文本區域JPanel 幾乎任何 GUI 都可以分解為多個JPanels 一旦你掌握了竅門,你就會到處看到JPanels

  5. 我以自己的方法創建每個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM