当前位置: 代码迷 >> J2SE >> 复选框菜单项——勾选取消后不回复初始状态
  详细解决方案

复选框菜单项——勾选取消后不回复初始状态

热度:142   发布时间:2016-04-23 19:48:12.0
复选框菜单项——勾选取消后不恢复初始状态
复选框勾选后,文本框中字体变成斜体;现在出现的问题是再取消勾选,字体不恢复成初始状态。。。
还有个问题:repaint();  语句删除后好像对程序没什么影响,,repaint();是做什么的??百度说是重绘此组件,不过还是不太理解

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class NO_6 extends JFrame implements ActionListener{
JRadioButtonMenuItem ColorItem[];
ButtonGroup ColorGroup,FontGroup;
JLabel txt;
JCheckBoxMenuItem cb=new JCheckBoxMenuItem("斜体");                                       //事件源
JMenuItem exitItem=new JMenuItem("退出");                                            //事件源
Color ColorValue[]={Color.red,Color.green,Color.blue};
public NO_6(){
        JMenuBar bar=new JMenuBar();
this.setJMenuBar(bar);
JMenu ColorMenu=new JMenu("颜色");
JMenu WindowMenu=new JMenu("窗口");
bar.add(ColorMenu);
bar.add(WindowMenu);
//颜色菜单项
String ColorName[]={"红色","绿色","蓝色"};
ColorItem=new JRadioButtonMenuItem[ColorName.length];
ColorGroup=new ButtonGroup();
for(int i=0;i<ColorName.length;i++){
ColorItem[i]=new JRadioButtonMenuItem(ColorName[i]);
ColorMenu.add(ColorItem[i]);
ColorGroup.add(ColorItem[i]);
ColorItem[i].addActionListener(this);
}
//窗体菜单项
ColorMenu.addSeparator();
FontGroup=new ButtonGroup();
// FontGroup.add(cb);                                                     //复选框添加到 按钮组中
ColorMenu.add(cb);                                                     //复选框添加到 菜单
WindowMenu.add(exitItem);
txt=new JLabel("变色了么",JLabel.CENTER);
Container c=this.getContentPane();
c.setLayout(new BorderLayout(1,1));
c.add(txt);
Font word=new Font("楷书",Font.PLAIN,68);
txt.setFont(word);

cb.addItemListener(new ItemListener(){
             public void itemStateChanged(ItemEvent e) {
// TODO Auto-generated method stub
if(cb.isSelected())txt.setFont(new Font("楷书",Font.ITALIC,68));
repaint();  

}

});
txt.setFont(new Font("楷书",Font.PLAIN,68));
exitItem.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e) {
System.exit(0);

}

});
}
public static void main(String[] args) {
NO_6 target=new NO_6();
target.setSize(500,200);
target.setLocation(400, 300);
target.setVisible(true);

}

public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
for(int i=0;i<ColorItem.length;i++){
if(ColorItem[i].isSelected()){
txt.setForeground(ColorValue[i]);
break;
}
}
}

}

------解决思路----------------------
cb.addItemListener(new ItemListener(){
             public void itemStateChanged(ItemEvent e) {
// TODO Auto-generated method stub
if(cb.isSelected())txt.setFont(new Font("楷书",Font.ITALIC,68));
repaint();  

只做了被选择的处理,没有处理取消选择的处理,程序当然没反应了。
加if(!cb.isSelected())

repaint就是把界面重新画一次,动画里面用的比较多。比如你设置了setFont,程序也运行了,但是看起来没效果,可能是系统没有画改变后的界面,你手动调用一次repaint就可以重新画一下,就可以显示出来效果了。你可以理解成  F5刷新
------解决思路----------------------
楼上说的对,选择是一个事件,取消是一个事件,把取消事件加个监听应该就好了的。
------解决思路----------------------

替换cb的这部分代码,就可以了,已测试。


                              cb.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
// TODO Auto-generated method stub
if (cb.isSelected())
txt.setFont(new Font("楷书", Font.ITALIC, 68));
else
txt.setFont(new Font("楷书", Font.PLAIN, 68));
repaint();
}

});
  相关解决方案