词法/语法分析器中Java Swing的一些应用

文章目录

第一章 将多个文本框添加到一个JScrollPane中
第二章 对JTabbedPane中的任意组件进行操作


前言

作为计算机人,编译原理虽然可能不是一门必修课但它还是可以学一学的。这个学期上了这门课,做了一个比较简易的词法/语法分析器,假期间打算再完善一下,其中部分界面如下
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127134116535.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjY3MTcw,size_16,color_FFFFFF,t_70#pic_center在这里插入图片描述
界面有两个重点:
1.两个文本框放在一个JScrollPane中,一个不可编辑用来显示行号;
一个可编辑用来编辑文本代码
2.选项卡方式放置文本内容,并需要对选项卡中的个文本组件进行操作
这一篇文章就主要讲述完成这两个界面会遇到的难点与解决方法。


一、如何将两个文本框(多个组件)放入一个JScrollPane中

进行词法/语法分析的时候,代码文件的大小是不确定的,当已有范围内放置不下代码时,就需要使用JScrollPane了。但是JScrollPane中只能放置一个组件,所以可以把组件用一个容器装起来,再把容器放入JScrollPane中。
但是有一个问题:当简单使用JPanel来装这两个文本的时候,会出现奇怪的现象:当出现滚动条的时候,用于编辑文本代码的文本框会分别在底部和顶部都减小半行,出现行号与代码行错位的现象。
为了解决这个问题,使用Box把它们装起来,这样就不会出现错位现象了

代码

代码如下(示例):

    public void init(){
        rowNumText = new JTextArea(10, 3);
        rowNumText.setPreferredSize(new Dimension(3, 10));
        rowNumText.setEnabled(false);
        rowNumText.setLineWrap(true);
        rowNumText.setWrapStyleWord(true);
        rowNumText.setBackground(new Color(10, 10, 10, 3));
        rowNumText.setFont(new Font("宋体", Font.BOLD, 20));

        codeArea = new JTextArea(10, 47);
        (codeArea.getDocument()).addDocumentListener(this);
        codeArea.setFont(new Font("宋体", Font.PLAIN, 20));

        Box box = Box.createHorizontalBox();
        box.add(rowNumText);
        box.add(codeArea);
        add(new JScrollPane(box));
    }

二、选中选项卡中的组件并进行操作

选项卡JTabbedPane的方法Component getSelectedComponent()可以返回选中的item。在词法/语法分析器中,用Box装下两个JTextArea,JScrollPane装下Box,JScrollPane add在了自定义的一个MainContent中,每当点击菜单进行打开/新建一个文件的时候,JTabbedPane就会使用add()添加一个MainContent(有点晕)。
词法/语法分析器需要对JTextArea进行操作,所以需要获取JTextArea的引用。

接下来直接先看代码

Component item = tab.getSelectedComponent();
Container box = (Container)((Container)((Container)((Container)item).getComponent(0)).getComponent(0)).getComponent(0);
                                                  //当前选中的选项->  MainContent  ->  JScrollPane   ->  Box
JTextArea codeArea = (JTextArea)(box.getComponent(1));
                                    // JTextArea

看了代码前面的文字叙述后再看代码,就感觉会很好理解了

总结

可能这篇文章没有讲什么有高度的东西,可以说都是一些Java Swing的基础操作,不过我在写代码的时候都没有搜到相关的文章,在解决这两个问题的时候还是废了一番力气才想到这样的方法,并且经过多次试验才成功的。所以想写下这篇文章供大家参考,同时也是自己的一个总结。

对于这些功能实现有更好方法的希望能一起分享哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值