簡體   English   中英

Java - 如何在 JTextArea 中放大/縮小文本

[英]Java - how to zoom in/zoom out text in JTextArea

我在記事本上寫字。 我想在我的記事本中實現文本縮放。 但我不知道該怎么做。 我正在嘗試找到它,但每個人都建議更改字體大小。 但我需要另一種解決方案。

我正在創建新項目並添加按鈕和 JTextArea。

package zoomtest;

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class zoom {

    private JFrame frame;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    zoom window = new zoom();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public zoom() {
        initialize();
    }

    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JPanel panel = new JPanel();
        frame.getContentPane().add(panel, BorderLayout.NORTH);
        
        JButton ZoomIn = new JButton("Zoom in");
        ZoomIn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                //Code here...
            }
        });
        panel.add(ZoomIn);
        
        JButton Zoomout = new JButton("Zoom out");
        Zoomout.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                //Code here...
            }
        });
        panel.add(Zoomout);
        
        JTextArea jta = new JTextArea();
        frame.getContentPane().add(jta, BorderLayout.CENTER);
    }

}


介紹

Oracle 有一個有用的教程,使用 Swing 創建 GUI 跳過使用 NetBeans IDE 學習搖擺部分。 密切注意在容器內布局組件部分。

我重新設計了你的 GUI。 這是應用程序啟動時的外觀。 我輸入了一些文字,以便您可以看到字體的變化。

在此處輸入圖像描述

這是我們縮小后的樣子。

在此處輸入圖像描述

這是我們放大后的樣子。

在此處輸入圖像描述

Stack Overflow 會縮放圖像,因此文本縮放並不那么明顯。

解釋

Swing 旨在與布局管理器一起使用。 我創建了兩個JPanels ,一個用於JButtons ,一個用於JTextArea 我將JTextArea放在JScrollPane中,這樣您就可以鍵入超過 10 行。

我在一個int字段中跟蹤字體大小。 這是一個簡單的應用模型。 您的 Swing 應用程序應始終具有由一個或多個普通 Java getter/setter 類組成的應用程序模型。

代碼

這是完整的可運行代碼。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class ZoomTextExample {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    new ZoomTextExample();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private int pointSize;

    private Font textFont;

    private JFrame frame;

    private JTextArea jta;

    private JTextField pointSizeField;

    public ZoomTextExample() {
        this.pointSize = 16;
        this.textFont = new Font(Font.DIALOG, Font.PLAIN, pointSize);
        initialize();
    }

    private void initialize() {
        frame = new JFrame("Text Editor");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(createButtonPanel(), BorderLayout.NORTH);
        frame.add(createTextAreaPanel(), BorderLayout.CENTER);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createButtonPanel() {
        JPanel panel = new JPanel(new FlowLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 5));

        JButton zoomIn = new JButton("Zoom in");
        zoomIn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                incrementPointSize(+2);
                updatePanels();
            }
        });
        panel.add(zoomIn);

        panel.add(Box.createHorizontalStrut(20));

        JLabel label = new JLabel("Current font size:");
        panel.add(label);

        pointSizeField = new JTextField(3);
        pointSizeField.setEditable(false);
        pointSizeField.setText(Integer.toString(pointSize));
        panel.add(pointSizeField);

        panel.add(Box.createHorizontalStrut(20));

        JButton zoomOut = new JButton("Zoom out");
        zoomOut.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                incrementPointSize(-2);
                updatePanels();
            }
        });
        panel.add(zoomOut);

        return panel;
    }

    private JPanel createTextAreaPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 5));

        jta = new JTextArea(10, 40);
        jta.setFont(textFont);
        JScrollPane scrollPane = new JScrollPane(jta);
        panel.add(scrollPane, BorderLayout.CENTER);

        return panel;
    }

    private void updatePanels() {
        pointSizeField.setText(Integer.toString(pointSize));
        textFont = textFont.deriveFont((float) pointSize);
        jta.setFont(textFont);
        frame.pack();
    }

    private void incrementPointSize(int increment) {
        pointSize += increment;
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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