当字体或文本大小改变时 JTextArea 改变其大小

如何解决当字体或文本大小改变时 JTextArea 改变其大小

我是 Java 初学者,我正在尝试制作一个可以更改字体和文本大小的简单文本编辑器。虽然它有一个问题,即文本区域大小似乎在更改某些内容时固定为字体和文本大小,但它仍然有效。 我希望文本区域的大小始终相同。我在调试时发现文本区域的行和列永远不会改变

更改字体前的图像:

https://i.stack.imgur.com/83nzf.png

更改字体后的图像:

https://i.stack.imgur.com/9AA2j.png

完整代码:

public class Run {
    public static void main(String args[]) {
        MainFrame main_frame = new MainFrame();
    }
}

public class MainFrame extends JFrame{

    private TextAreaPanel text_area_panel = new TextAreaPanel(60,20);
    private ComboBoxesPanel combo_boxes_panel = new ComboBoxesPanel(this.text_area_panel);
    
    public MainFrame() {
        this.initUI();
    }
    
    private void initUI() {
        setLayout(new BorderLayout());
        add(combo_boxes_panel,BorderLayout.NORTH);
        add(text_area_panel,BorderLayout.CENTER);
        setSize(getToolkit().getScreenSize().width / 2,getToolkit().getScreenSize().height / 2);
        setLocation(getToolkit().getScreenSize().width / 4,getToolkit().getScreenSize().height / 4);
        setTitle("Simple Text Editor");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }
}

public class TextAreaPanel extends JPanel{
    
    private JTextArea text_area = new JTextArea();
    private JScrollPane scroll_text_area = new JScrollPane(text_area);
    
    public TextAreaPanel(int width,int height) {
        this.addComponets();
        setTextAreaSize(width,height);
    }
    
    private void addComponets() {
        add(scroll_text_area);
    }
    
    public void setTextAreaSize(int width,int height) {
        text_area.setRows(height);
        text_area.setColumns(width);
    }
    
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        //setTextAreaSize(getWidth() / 15,getHeight() / 20);
    }
    
    public JTextArea getArea() {
        return this.text_area;
        }
}

public class ComboBoxesPanel extends JPanel{
    
    private String[] system_fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
    private Object[] sizes = {8,10,12,14,16,20,24,36,48};
    private JComboBox font_box = new JComboBox(system_fonts);
    private JComboBox size_box = new JComboBox(sizes);
    private TextAreaPanel text_area_panel;
    
    public ComboBoxesPanel(TextAreaPanel text_area_panel) {
        this.text_area_panel = text_area_panel;
        font_box.addActionListener(font_listener);
        size_box.addActionListener(size_listener);
        add(font_box);
        add(size_box);
    }
    
    private ActionListener font_listener = new ActionListener() {
        
        @Override
        public void actionPerformed(ActionEvent e) {
            
            (text_area_panel.getArea()).setFont(new Font((String)font_box.getSelectedItem(),Font.PLAIN,(int)size_box.getSelectedItem()));
        }
    };
    
    private ActionListener size_listener = new ActionListener() {
        
        @Override
        public void actionPerformed(ActionEvent e) {
            (text_area_panel.getArea()).setFont(new Font((String)font_box.getSelectedItem(),(int)size_box.getSelectedItem()));
        }
    };
    
}

有人知道如何解决这个问题吗?知道如何解决这个问题吗? 如果有人想提供帮助,还有我的 GitLab 存储库中的所有代码https://gitlab.com/RichardCG/simpletexteditor 谢谢。 :)

解决方法

首先,我将吹嘘一下你的变量名。

当您创建 JTextArea 时,您指定文本区域的“行/列”:

  1. 为什么在类中使用“宽度/高度”作为变量名?在 Swing 中,“宽度/高度”用于表示像素值。
  2. 为什么要更改变量的顺序?您指定“行、列”作为文本区域的参数。为什么要将参数顺序更改为“宽度,高度”。 “宽度”与“行”无关。

API 不一致时会令人困惑。

文字区域大小好像固定为字体和文字大小

正确,所有 Swing 组件都负责确定自己的首选大小。大小基于组件的属性。因此,当您更改字体或字体大小时,组件将重新计算其首选大小。

这是一件好事,因为它允许:

  1. 布局管理器正常工作
  2. 滚动窗格正常工作,因为滚动条会在需要时出现。

我希望文本区域的大小始终相同

您可以控制滚动窗格的大小,从而使文本区域保持大小,同时根据需要显示/隐藏滚动条。

在你类的构造函数中你可以添加:

int scrollBarSize = UIManager.getInt("ScrollBar.width");
Dimension d = text_area.getPreferredSize();
d.width += scrollBarSize;
d.height += scrollBarSize;
scroll_text_area.setPreferredSize(d);

这是可行的,因为 FlowLayout 尊重添加到面板的任何组件的首选大小。

然而,这不是一个好的解决方案。相反,您应该将编辑器设计为对用户更加友好。

对于我使用过的任何编辑器,编辑器组件会占用框架中的所有可用空间。因此,您可能有一个工具栏(在顶部)或状态栏(在底部),而编辑器会占用剩余空间。这允许编辑器大小随着用户调整框架大小而改变。

因此,通常在创建文本区域并将文本区域添加到 JScrollPane 时,您只需设置 JTextArea 的行/列。然后滚动窗格被添加到BorderLayout 的CENTER 上。框架,然后在使框架可见之前pack() 框架。

不需要 TextAreaPanel 类。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res