繁体   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