当前位置: 代码迷 >> J2SE >> 双窗口,调色板窗口失去的颜色无法传回主窗口
  详细解决方案

双窗口,调色板窗口失去的颜色无法传回主窗口

热度:52   发布时间:2016-04-23 19:35:42.0
双窗口,调色板窗口得到的颜色无法传回主窗口
本帖最后由 WZ22HAO 于 2015-11-12 22:36:59 编辑
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;

class MyNotepad extends JFrame implements ActionListener {
private JTextArea editText;
File fOpen = null;
String clipBoard = ""; // 粘贴板
JPanel jp = new JPanel();
JMenuItem item1_1, item1_2, item1_3, item1_4, item2_1, item2_2, item2_3, item3_1, item3_2, item3_3, item3_4;

public MyNotepad() {
super("我的简单记事本");
this.setResizable(false);
editText = new JTextArea();
editText.setTabSize(4);
editText.setEditable(true);
JScrollPane scroll = new JScrollPane(editText);
JMenuBar mb = new JMenuBar(); // 菜单栏
setJMenuBar(mb);
JMenu menu1 = new JMenu("文件");
JMenu menu2 = new JMenu("编辑");
JMenu menu3 = new JMenu("文本颜色");
JMenu menu4 = new JMenu("帮助");
mb.add(menu1);
mb.add(menu2);
mb.add(menu3);
mb.add(menu4);

item1_1 = new JMenuItem("打开"); // 文件菜单
item1_2 = new JMenuItem("保存");
item1_3 = new JMenuItem("另存为");
item1_4 = new JMenuItem("退出");
menu1.add(item1_1);
menu1.addSeparator();
menu1.add(item1_2);
menu1.addSeparator();
menu1.add(item1_3);
menu1.addSeparator();
menu1.add(item1_4);
item1_1.addActionListener(this);
item1_2.addActionListener(this);
item1_3.addActionListener(this);
item1_4.addActionListener(this);

item2_1 = new JMenuItem("复制"); // 编辑菜单
item2_2 = new JMenuItem("剪切");
item2_3 = new JMenuItem("粘贴");
menu2.add(item2_1);
menu2.addSeparator();
menu2.add(item2_2);
menu2.addSeparator();
menu2.add(item2_3);
item2_1.addActionListener(this);
item2_2.addActionListener(this);
item2_3.addActionListener(this);

item3_1 = new JMenuItem("红色"); // 文本颜色菜单
item3_2 = new JMenuItem("绿色");
item3_3 = new JMenuItem("蓝色");
item3_4 = new JMenuItem("自定义");
menu3.add(item3_1);
menu3.addSeparator();
menu3.add(item3_2);
menu3.addSeparator();
menu3.add(item3_3);
menu3.addSeparator();
menu3.add(item3_4);
item3_1.addActionListener(this);
item3_2.addActionListener(this);
item3_3.addActionListener(this);
item3_4.addActionListener(this);

jp.setLayout(new BorderLayout());
jp.add(scroll, BorderLayout.CENTER);
add(jp);
setBounds(200, 100, 1000, 600);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void actionPerformed(ActionEvent e) {
if (e.getSource() == item1_1) {

} else if (e.getSource() == item1_2) {

} else if (e.getSource() == item1_3) {

} else if (e.getSource() == item1_4) {
System.exit(0);
} else if (e.getSource() == item2_1) {

} else if (e.getSource() == item2_2) {

} else if (e.getSource() == item2_3) {

} else if (e.getSource() == item3_1) {
editText.setForeground(Color.RED);
} else if (e.getSource() == item3_2) {
editText.setForeground(Color.GREEN);
} else if (e.getSource() == item3_3) {
editText.setForeground(Color.BLUE);
} else if (e.getSource() == item3_4) {
ColorChooser cc = new ColorChooser();
editText.setText(""+cc.myColor.getRGB());//无法输出
editText.setForeground(cc.myColor);//设置不了文本颜色
}
}
}

class ColorChooser extends JFrame implements ActionListener {
JPanel jp = new JPanel();
JPanel jpbutton = new JPanel();
JColorChooser jcc = new JColorChooser();
JButton button1, button2, button3;
public Color myColor;

ColorChooser() {
super("调色板");
button1 = new JButton("确定");
button2 = new JButton("取消");
button3 = new JButton("重置");
button3.setMnemonic('r');
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);
jp.setLayout(new BorderLayout());
jp.add(jcc, BorderLayout.CENTER);
jp.add(jpbutton, BorderLayout.SOUTH);
jpbutton.add(button1);
jpbutton.add(button2);
jpbutton.add(button3);
add(jp);
setVisible(true);
setBounds(300, 200, 800, 400);
}

public void actionPerformed(ActionEvent e) {
if (e.getSource() == button1) {
myColor=jcc.getColor();//这里取得调色板颜色
this.setVisible(false);
} else if (e.getSource() == button2) {
this.setVisible(false);
} else {
jcc.setColor(255, 255, 255);
}
}
}

public class NotepadTest {
public static void main(String[] args) {
new MyNotepad();
}
}

------解决思路----------------------
1、改写ColorChooser类,设置一个MyNotepad类型的成员变量pad,改写 的构造方法,接受一个MyNotepad类型的参数,赋值给pad
2、点“自定义”菜单项时生成ColorChooser窗体,并传入参数this,去掉其他操作
3、为MyNotepad类编写一个方法public setTextColor(Color color),用于设置文本颜色
4、当在ColorChooser窗体中点击“确定”按钮时,增加一句代码调用pad的setTextColor()
5、OK了。
------解决思路----------------------
你new ColorChooser窗口时,ColorChooser类并没有给MyColor赋初始值,所以,它会被初始化为null,而打开窗口这个过程不是阻塞的,也就是说,你new ColorChooser后,editText.setForeground(cc.myColor);立刻被执行,于是,这里会抛出空指针异常
------解决思路----------------------
这不是异步操作,还是顺序执行。
1、你点“自定义”后,系统开始处理,显示去执行调色板的构造方法,直到它显示出来
2、然后就回来执行后面的setText()以及以下的代码
3、执行完后,系统开始等待你的操作。
4、你可以在调色板里面操作,也可以在主面板操作,系统根据操作做响应
以上这个过程是标准的事件驱动机制啊
  相关解决方案