双窗口,调色板窗口得到的颜色无法传回主窗口

WZ22HAO 2015-11-12 10:35:28
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();
}
}
...全文
144 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
WZ22HAO 2015-11-14
  • 打赏
  • 举报
回复
引用 6 楼 zys59 的回复:
这不是异步操作,还是顺序执行。 1、你点“自定义”后,系统开始处理,显示去执行调色板的构造方法,直到它显示出来 2、然后就回来执行后面的setText()以及以下的代码 3、执行完后,系统开始等待你的操作。 4、你可以在调色板里面操作,也可以在主面板操作,系统根据操作做响应 以上这个过程是标准的事件驱动机制啊
我明白啦,谢谢~~~
三仙半 2015-11-14
  • 打赏
  • 举报
回复
这不是异步操作,还是顺序执行。 1、你点“自定义”后,系统开始处理,显示去执行调色板的构造方法,直到它显示出来 2、然后就回来执行后面的setText()以及以下的代码 3、执行完后,系统开始等待你的操作。 4、你可以在调色板里面操作,也可以在主面板操作,系统根据操作做响应 以上这个过程是标准的事件驱动机制啊
WZ22HAO 2015-11-14
  • 打赏
  • 举报
回复
其他问题:新建对象在得到调色板action事件之前,在主窗口的代码已经往下跑了是吗,这是不是多线程异步执行? java多线程我还没有学到,我现在的理解是:是不是应该把取得调色板事件与主窗口事件同步执行?需要阻塞线程来让代码顺序执行,需要通过信号量机制来实现嘛
WZ22HAO 2015-11-13
  • 打赏
  • 举报
回复
引用 3 楼 zys59 的回复:
你new ColorChooser窗口时,ColorChooser类并没有给MyColor赋初始值,所以,它会被初始化为null,而打开窗口这个过程不是阻塞的,也就是说,你new ColorChooser后,editText.setForeground(cc.myColor);立刻被执行,于是,这里会抛出空指针异常。
谢谢! 也就是说新建对象在得到调色板action事件之前,在主窗口的代码已经往下跑了是吗,这是不是多线程异步执行? java多线程我还没有学到,我现在的理解是:是不是应该把取得调色板事件与主窗口事件同步执行?需要阻塞线程来让代码顺序执行,需要通过信号量机制来实现嘛
三仙半 2015-11-13
  • 打赏
  • 举报
回复
你new ColorChooser窗口时,ColorChooser类并没有给MyColor赋初始值,所以,它会被初始化为null,而打开窗口这个过程不是阻塞的,也就是说,你new ColorChooser后,editText.setForeground(cc.myColor);立刻被执行,于是,这里会抛出空指针异常。
WZ22HAO 2015-11-13
  • 打赏
  • 举报
回复
引用 1 楼 zys59 的回复:
1、改写ColorChooser类,设置一个MyNotepad类型的成员变量pad,改写 的构造方法,接受一个MyNotepad类型的参数,赋值给pad 2、点“自定义”菜单项时生成ColorChooser窗体,并传入参数this,去掉其他操作 3、为MyNotepad类编写一个方法public setTextColor(Color color),用于设置文本颜色 4、当在ColorChooser窗体中点击“确定”按钮时,增加一句代码调用pad的setTextColor() 5、OK了。
改完之后可以了,不过为什么我之前的代码不可以? MyNotepad也实例化了,按自定义之后实例化调色器面板,我觉得应该可以直接取得调色器的颜色啊,而且颜色是调色器窗口的公共变量
三仙半 2015-11-13
  • 打赏
  • 举报
回复
1、改写ColorChooser类,设置一个MyNotepad类型的成员变量pad,改写 的构造方法,接受一个MyNotepad类型的参数,赋值给pad 2、点“自定义”菜单项时生成ColorChooser窗体,并传入参数this,去掉其他操作 3、为MyNotepad类编写一个方法public setTextColor(Color color),用于设置文本颜色 4、当在ColorChooser窗体中点击“确定”按钮时,增加一句代码调用pad的setTextColor() 5、OK了。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧