Notepad是我第一次编写Java GUI界面的作业,当初看题目很简单:模拟Windows记事本,随着功能的逐步加入,一些在书本上看不到的问题显现出来。特此记录。
1.布局问题
FontChooser这个实现字体选择对话框的类中,要把”字体“,”字形“,大小”3个标签和下面的Jlist对齐。我一开始想到用网格包布局,通过GridConstrant的Gridx和GridWidth设置位置和大小,·但是没有效果,两个标签还是挤在一起。最后没法只能用网格布局:
private JPanel jdPanelUP = new JPanel(new GridLayout(1, 2, 40, 10));
但三个标签宽度不一样,又不想用setBounds指定位置和大小,最后只能把两个标签的内容合并到一个:
private JLabel jdLabel2 = new JLabel("字形: 大小:");
结果还是自己指定了宽度。。。
2.JList自动翻滚问题
FontChooser中FontName这个List在初始化的时候应该自动滚动到“宋体”项。
这个可以自动翻滚:
jdList1.setAutoscrolls(true);
jdList1.setSelectedValue(fontName, true);
这个就不行了:
jdList3.setAutoscrolls(true);
jdList3.setSelectedIndex(25);
3.JTextField弹出气泡框问题
记事本的“转到”功能里,如果输入了非数字字符,文本框会自动弹出一个气泡提示输入合法的字符。GotoLine中TextField没有这个功能,只能设置ToolTipText,但这是鼠标移上去才会显示,可能需要调用Windows环境的函数才能实现吧。
4.StateBar隐式递归调用导致 Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 问题
StateBar继承了JPanel,为了绘制上下阴影,重写了protected void paintComponent(Graphics g):
protected void paintComponent(Graphics g){
super.paint(g);
//状态栏顶部阴影
//状态栏底部阴影
}
难道调用父类的paint又会Call子类的paintComponent?去掉以后正常,说明在子类的paintComponent之前已经绘制了父类的Component?
5.TextArea输入字符导致StateBar右下角同步出现输入字符的问题
完全没有思路。
6.在MainGui中用StateBar添加监听事件,在里面对StateBar调用方法,会导致Cannot refer to a non-final variable bar inside an inner class defined in a different method 问题
错误是指在一个Method中定义的内部类不能引用另一个Method的非final量,原因就在于内部类和Method的局部变量生存周期不一致。原来是在mainGui添加监听事件:
init(){
stateBar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(stateBar.getState()==true){
barmain.setVisible(true);
barmain.adjustWidth(main.frame);
}
else
barmain.setVisible(false);
main.frame.pack();//需要自动调节frame大小
}});
//......
}
把其移动到另一个类就可以了,深层原因?