《CoreJava2》中的一个事件触发的例子。我在其中添加了两个快捷键。其中“ctrl+N”可用,而"ctrl+C"不可用。麻烦帮我看一下为什么? 如何实现ctrl+C的功能。多谢……
========================
代码如下:MulticastTest.java
package event;
import javax.swing.*;
import java.awt.*;
import java.awt.even;public class MulticastTest {
public static void main(String[] args){
MulticastFrame frame = new MulticastFrame();
frame.setDefaultCloseOperation(3);
frame.show();
}
}class MulticastFrame extends JFrame {
public MulticastFrame() {
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension d = kit.getScreenSize();
final int X = d.width;
final int Y = d.height;
setTitle("MulticastFrame");
setBounds(X/4,Y/4,X/2,Y/2);
Container contentPane = getContentPane();
contentPane.add(new MulticastPanel());
}
}class MulticastPanel extends JPanel{
public MulticastPanel(){
setBackground(Color.ORANGE);
JButton addFrameButton = new JButton("AddFrame");
final JButton closeAllButton = new JButton("CloseAll");
add(addFrameButton);
add(closeAllButton);
Action addListener = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
final BlankFrame blankframe = new BlankFrame(closeAllButton);
blankframe.show();
requestFocus();
//创建完BlankFrame之后,将焦点转移回MulticastFrame
}
}; addFrameButton.addActionListener(addListener); //定义快捷键
InputMap imap = getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
imap.put(KeyStroke.getKeyStroke("ctrl N"), "new Frame");
imap.put(KeyStroke.getKeyStroke("ctrl C"), "close Frame"); ActionMap amap = getActionMap();
amap.put("new Frame", addListener);
amap.put("close Frame", blankframe.closeListener);
} private Action listener;
}//MulticastPanel//new Frame
class BlankFrame extends JFrame{
public BlankFrame(final JButton closeButton){ //final
counter++;
setTitle("BlankFrame"+counter);
setSize(DEF_WIDTH,DEF_HEIGHT);
setLocation(SPACING*counter,SPACING*counter); button = closeButton; getContentPane().add(new BlankPanel()); } public static Action getListener() {
return(closeListener);
} private class BlankPanel extends JPanel{
public BlankPanel(){
setBackground(Color.ORANGE.darker()); closeListener = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
button.removeActionListener(this);
dispose();
counter = 0;
}
}; button.addActionListener(closeListener);
}
} private JButton button;
private static Action closeListener;
private static int counter = 0;
private final int DEF_WIDTH = 200;
private final int DEF_HEIGHT = 150;
private final int SPACING = 20;
}//键盘操作ctrl+C如何实现? closeListener的添加问题
==========================================================
我觉得问题出在closeListener上。因为closeListener不是在MulticastFrame中定义的,要怎么在MulticastFrame中使它和ctrl+C关联。
========================
代码如下:MulticastTest.java
package event;
import javax.swing.*;
import java.awt.*;
import java.awt.even;public class MulticastTest {
public static void main(String[] args){
MulticastFrame frame = new MulticastFrame();
frame.setDefaultCloseOperation(3);
frame.show();
}
}class MulticastFrame extends JFrame {
public MulticastFrame() {
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension d = kit.getScreenSize();
final int X = d.width;
final int Y = d.height;
setTitle("MulticastFrame");
setBounds(X/4,Y/4,X/2,Y/2);
Container contentPane = getContentPane();
contentPane.add(new MulticastPanel());
}
}class MulticastPanel extends JPanel{
public MulticastPanel(){
setBackground(Color.ORANGE);
JButton addFrameButton = new JButton("AddFrame");
final JButton closeAllButton = new JButton("CloseAll");
add(addFrameButton);
add(closeAllButton);
Action addListener = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
final BlankFrame blankframe = new BlankFrame(closeAllButton);
blankframe.show();
requestFocus();
//创建完BlankFrame之后,将焦点转移回MulticastFrame
}
}; addFrameButton.addActionListener(addListener); //定义快捷键
InputMap imap = getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
imap.put(KeyStroke.getKeyStroke("ctrl N"), "new Frame");
imap.put(KeyStroke.getKeyStroke("ctrl C"), "close Frame"); ActionMap amap = getActionMap();
amap.put("new Frame", addListener);
amap.put("close Frame", blankframe.closeListener);
} private Action listener;
}//MulticastPanel//new Frame
class BlankFrame extends JFrame{
public BlankFrame(final JButton closeButton){ //final
counter++;
setTitle("BlankFrame"+counter);
setSize(DEF_WIDTH,DEF_HEIGHT);
setLocation(SPACING*counter,SPACING*counter); button = closeButton; getContentPane().add(new BlankPanel()); } public static Action getListener() {
return(closeListener);
} private class BlankPanel extends JPanel{
public BlankPanel(){
setBackground(Color.ORANGE.darker()); closeListener = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
button.removeActionListener(this);
dispose();
counter = 0;
}
}; button.addActionListener(closeListener);
}
} private JButton button;
private static Action closeListener;
private static int counter = 0;
private final int DEF_WIDTH = 200;
private final int DEF_HEIGHT = 150;
private final int SPACING = 20;
}//键盘操作ctrl+C如何实现? closeListener的添加问题
==========================================================
我觉得问题出在closeListener上。因为closeListener不是在MulticastFrame中定义的,要怎么在MulticastFrame中使它和ctrl+C关联。
解决方案 »
- Java核心技术书中关于Manger和staff例子中多态的问题
- JPopupMenu的使用
- 直接定义数组和用new定义数组区别是什么
- qq功能分析
- 接触SWT不久,想弄到一个swt库,就是那个SWT.ZIP,哪里能下载到?
- 100分新手提问:jni如果生成h文件
- JCreator高手请进!!
- 真是奇怪,连数据库出现了这种情况java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver
- 那里有程序里用到的小图标下载啊?
- 用JAVA能不能写出能操作WINDOWS注册表的程序阿?能,还是不能?
- java中的转换
- 关于jTextArea换行的问题
能说的再清楚一点吗?
多谢多谢~
终于有人回复我了,感动的ToT....不过,好像不是因为这个原因。
我把快捷键改成ctrl+Q还是不行~晕撅~继续期待达人出现~