如何将jtextpane和jtextarea添加到jscrollpane中?

xlpyo6sf  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(411)

我正在尝试用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);

任何帮助都会得到感谢。

kmynzznz

kmynzznz1#

我创造了一个 JFrame 用一个 JTextPane 和一个 JTextArea .

如您所见,有行号、文本区域和滚动条。
下面是我创建这个gui的步骤。
我通过调用
SwingUtilities invokeLater 方法。此方法确保在事件调度线程上创建和执行swing组件。
我使用swing布局管理器。这是至关重要的。如果不使用布局管理器,就无法构建复杂的swing gui。不可能。不可思议。
这个 JFrame 有默认值 BorderLayout . 我把主要的 JPanel 在中间。创建状态时 JPanel ,你可以把它 JPanel 在最后一行之后。
我创建一个主 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) {

        }

    }

}

相关问题