文章目录
第一章 将多个文本框添加到一个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的基础操作,不过我在写代码的时候都没有搜到相关的文章,在解决这两个问题的时候还是废了一番力气才想到这样的方法,并且经过多次试验才成功的。所以想写下这篇文章供大家参考,同时也是自己的一个总结。对于这些功能实现有更好方法的希望能一起分享哦