今日体会之JTabbedPane的使用和JFrame的透明化方法

来源:互联网 发布:php构造函数的作用 编辑:程序博客网 时间:2024/06/01 10:47
JTabbedPane总的来说还是很好用的,分区显示是特色,但是我要更新数据就让我蛋疼了

首先他有个addChangeListener方法,开始试了一下是在selectedIndex改变时会调用,然后我就兴致勃勃的写了

tabbedPane.addChangeListener(new ChangeListener() {@Overridepublic void stateChanged(ChangeEvent e) {if(tabbedPane.getSelectedIndex()==1){//省略中间无关代码tabbedPane.remove(1);tabbedPane.insertTab(*,*,*,*,1);}}});



这时候会报错,无限死循环导致栈溢出。所以我首先想到的是,可能是remove,insertTab甚至是addTab在使用时都会调用stateChanged();

不过我猜想是因为selectedIndex改变了,所以我傻傻的写了下面的代码

tabbedPane.addChangeListener(new ChangeListener() {@Overridepublic void stateChanged(ChangeEvent e) {if(tabbedPane.getSelectedIndex()==1){//省略中间无关代码tabbedPane.setSelectedIndex(-1);tabbedPane.remove(1);tabbedPane.setSelectedIndex(-1);tabbedPane.insertTab(*,*,*,*,1);tabbedPane.setSelectedIndex(-1);}}});



结果还是一样,无限死循环,现在想起来才觉得自己好傻,怎么会这样做。

所以我想到了是不是这个Listener的问题。于是乎,我就这样做

tabbedPane.addChangeListener(new ChangeListener() {@Overridepublic void stateChanged(ChangeEvent e) {if(tabbedPane.getSelectedIndex()==1){//省略中间无关代码tabbedPane.removeChangeListener(this);tabbedPane.remove(1);tabbedPane.insertTab(*,*,*,*,1);tabbedPane.addChangeListener(this);}}});



结果没有进入死循环,还好,解决了一小步了,这也证明了我的猜想,API上面只说状态改变却没告诉我什么叫状态改变。我也理解了为什么第一次测试的时候会输出3个数字了,我第一次是用的下面的代码:

tabbedPane.addChangeListener(new ChangeListener() {@Overridepublic void stateChanged(ChangeEvent e) {if(tabbedPane.getSelectedIndex()==1){//省略中间无关代码System.out,println("1");tabbedPane.remove(1);tabbedPane.insertTab(*,*,*,*,1);}}});



因为我加了4个tab所以会有这种结果。现在知道了,changeListener里面不能直接改变tabbedPane的“状态”

再者我又另辟蹊径,找到了另外一种方法,解决了tabbedPane刷新的方法,不是tabbedPane。repaint();而是tabbedPane.setComponentAt(1, picturePanel);

这个方法才实现了真正意义上的刷新,把整个界面都刷了。很好用



第二篇章:透明的JFrame。

这个方法我也在网上找了好久,什么setOpaque(),什么用sun.com.swt里面的AWTUtilities我试过了都没有我想要的结果
真正帮我实现的是我的一位同学

具体代码如下,其实就是设置背景色new Color(255,255,255,1);

JFrame frame = new JFrame();frame.setUndecorated(true);frame.setBackground(new Color(255,255,255,1));frame.getContentPane().setLayout(null);frame.setSize(WIDTH,HEIGHT);frame.setVisible(true);


如果要还可以选择背景后面的其他东西可以设置背景色new Color(255,255,255,0);


活到老,学到老,继续,我要写完我的新手引导界面,哈哈哈哈