求助使用匿名内部类实现事件处理

时间:2023-01-02 11:28:07

// frame 里有一个jtextfield 和一个button ,当点击按钮后,实现把编辑框里的内容变为窗口标题
// 问题是在响应方法里如何获取frame这个对象。
button.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {

}
});

7 个解决方案

#1


以下代码可供你参考下:主要是局部内部类如何访问外部类的成员变量、局部变量以及引用外部类本身
1、frame属于某个类的成员变量时

package swing;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class Demo7 {
private JFrame jf=new JFrame("test");
private JButton jb=new JButton("按下");
public void init()
{
jb.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
jf.setTitle("gg");//jf和jb同属于某个类的成员变量,则直接使用其名字jf即可
}
});
jf.add(jb);
jf.pack();
jf.setVisible(true);
}
public static void main(String[] args) {
new Demo7().init();
}
}

2、frame变量同属于某个方法的局部变量时
package swing;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
public class Demo6 {
public static void main(String[] args) {
final JFrame jf=new JFrame("test");
JButton jb=new JButton("按下");
jb.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
jf.setTitle("gg");//jf和jb是同属于某个方法的局部变量,则须将jf声明为final,然后直接使用其名字jf即可
}
});
jf.add(jb);
jf.pack();
jf.setVisible(true);
}

}

3、button属于frame的成员变量时
package swing;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class Demo5 {
public static void main(String[] args) {
JFrame jf=new MyJFrame("test");
jf.pack();
jf.setVisible(true);
}

}

class MyJFrame extends JFrame
{
private JButton jb=new JButton("按下");
public MyJFrame(String str)
{
super(str);
jb.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
MyJFrame.this.setTitle("gg"); //jb属于MyFrame类的成员变量,则通过MyJFrame.this方式引用MyFrame类的当前实例
}
});
this.add(jb);
}
}

#2


final JFrame frame = new JFrame("...");
final JTextField input = new JTextField();
final JButton click = new JButton("Update Title");
... // add component to frame
click.addActionListener(new ActionListener(){
    @Override public void actionPerformed(ActionEvent e){
        frame.setTitle(input.getText());
    }
});

#3


引用 1 楼 u010005508 的回复:
以下代码可供你参考下:主要是局部内部类如何访问外部类的成员变量、局部变量以及引用外部类本身
1、frame属于某个类的成员变量时

package swing;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class Demo7 {
private JFrame jf=new JFrame("test");
private JButton jb=new JButton("按下");
public void init()
{
jb.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
jf.setTitle("gg");//jf和jb同属于某个类的成员变量,则直接使用其名字jf即可
}
});
jf.add(jb);
jf.pack();
jf.setVisible(true);
}
public static void main(String[] args) {
new Demo7().init();
}
}

2、frame变量同属于某个方法的局部变量时
package swing;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
public class Demo6 {
public static void main(String[] args) {
final JFrame jf=new JFrame("test");
JButton jb=new JButton("按下");
jb.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
jf.setTitle("gg");//jf和jb是同属于某个方法的局部变量,则须将jf声明为final,然后直接使用其名字jf即可
}
});
jf.add(jb);
jf.pack();
jf.setVisible(true);
}

}

3、button属于frame的成员变量时
package swing;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class Demo5 {
public static void main(String[] args) {
JFrame jf=new MyJFrame("test");
jf.pack();
jf.setVisible(true);
}

}

class MyJFrame extends JFrame
{
private JButton jb=new JButton("按下");
public MyJFrame(String str)
{
super(str);
jb.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
MyJFrame.this.setTitle("gg"); //jb属于MyFrame类的成员变量,则通过MyJFrame.this方式引用MyFrame类的当前实例
}
});
this.add(jb);
}
}

多谢提醒。我想我该好好看书了、这都是基础语法。 求助使用匿名内部类实现事件处理

#4


进来复习一下基础知识!

#5


引用 2 楼 huntor 的回复:
final JFrame frame = new JFrame("...");
final JTextField input = new JTextField();
final JButton click = new JButton("Update Title");
... // add component to frame
click.addActionListener(new ActionListener(){
    @Override public void actionPerformed(ActionEvent e){
        frame.setTitle(input.getText());
    }
});

求助为按钮设置快捷键,我想为一个按钮设置回车为快捷键,不需要按alt的那种,下面尝试为何失败了,求指导
Action sendMessege = new AbstractAction() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
displayArea.append(editArea.getText()+"\n");
editArea.setText("");
editArea.requestFocus();
}
};

sendButton.addActionListener(sendMessege);
sendButton.registerKeyboardAction(sendMessege, 
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), JComponent.WHEN_IN_FOCUSED_WINDOW);

/*这是另一种方法。也没成功
InputMap inputMap = sendButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(KeyStroke.getKeyStroke((char)(KeyEvent.VK_ENTER)), "send");
sendButton.getActionMap().put("send", sendMessege);

sendButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {

}
});
*/

#6


引用 5 楼 u010749411 的回复:
Quote: 引用 2 楼 huntor 的回复:

final JFrame frame = new JFrame("...");
final JTextField input = new JTextField();
final JButton click = new JButton("Update Title");
... // add component to frame
click.addActionListener(new ActionListener(){
    @Override public void actionPerformed(ActionEvent e){
        frame.setTitle(input.getText());
    }
});

求助为按钮设置快捷键,我想为一个按钮设置回车为快捷键,不需要按alt的那种,下面尝试为何失败了,求指导
Action sendMessege = new AbstractAction() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
displayArea.append(editArea.getText()+"\n");
editArea.setText("");
editArea.requestFocus();
}
};

sendButton.addActionListener(sendMessege);
sendButton.registerKeyboardAction(sendMessege, 
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), JComponent.WHEN_IN_FOCUSED_WINDOW);

/*这是另一种方法。也没成功
InputMap inputMap = sendButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(KeyStroke.getKeyStroke((char)(KeyEvent.VK_ENTER)), "send");
sendButton.getActionMap().put("send", sendMessege);

sendButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {

}
});
*/
按钮有焦点才行。
看看 JRootPane的setDefaultButton方法

#7


按钮有焦点才行。
看看 JRootPane的setDefaultButton方法

当我在编辑框中编辑时,编辑框具有焦点。按钮没有焦点,怎么做到按下回车启动按钮?

#1


以下代码可供你参考下:主要是局部内部类如何访问外部类的成员变量、局部变量以及引用外部类本身
1、frame属于某个类的成员变量时

package swing;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class Demo7 {
private JFrame jf=new JFrame("test");
private JButton jb=new JButton("按下");
public void init()
{
jb.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
jf.setTitle("gg");//jf和jb同属于某个类的成员变量,则直接使用其名字jf即可
}
});
jf.add(jb);
jf.pack();
jf.setVisible(true);
}
public static void main(String[] args) {
new Demo7().init();
}
}

2、frame变量同属于某个方法的局部变量时
package swing;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
public class Demo6 {
public static void main(String[] args) {
final JFrame jf=new JFrame("test");
JButton jb=new JButton("按下");
jb.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
jf.setTitle("gg");//jf和jb是同属于某个方法的局部变量,则须将jf声明为final,然后直接使用其名字jf即可
}
});
jf.add(jb);
jf.pack();
jf.setVisible(true);
}

}

3、button属于frame的成员变量时
package swing;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class Demo5 {
public static void main(String[] args) {
JFrame jf=new MyJFrame("test");
jf.pack();
jf.setVisible(true);
}

}

class MyJFrame extends JFrame
{
private JButton jb=new JButton("按下");
public MyJFrame(String str)
{
super(str);
jb.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
MyJFrame.this.setTitle("gg"); //jb属于MyFrame类的成员变量,则通过MyJFrame.this方式引用MyFrame类的当前实例
}
});
this.add(jb);
}
}

#2


final JFrame frame = new JFrame("...");
final JTextField input = new JTextField();
final JButton click = new JButton("Update Title");
... // add component to frame
click.addActionListener(new ActionListener(){
    @Override public void actionPerformed(ActionEvent e){
        frame.setTitle(input.getText());
    }
});

#3


引用 1 楼 u010005508 的回复:
以下代码可供你参考下:主要是局部内部类如何访问外部类的成员变量、局部变量以及引用外部类本身
1、frame属于某个类的成员变量时

package swing;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class Demo7 {
private JFrame jf=new JFrame("test");
private JButton jb=new JButton("按下");
public void init()
{
jb.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
jf.setTitle("gg");//jf和jb同属于某个类的成员变量,则直接使用其名字jf即可
}
});
jf.add(jb);
jf.pack();
jf.setVisible(true);
}
public static void main(String[] args) {
new Demo7().init();
}
}

2、frame变量同属于某个方法的局部变量时
package swing;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
public class Demo6 {
public static void main(String[] args) {
final JFrame jf=new JFrame("test");
JButton jb=new JButton("按下");
jb.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
jf.setTitle("gg");//jf和jb是同属于某个方法的局部变量,则须将jf声明为final,然后直接使用其名字jf即可
}
});
jf.add(jb);
jf.pack();
jf.setVisible(true);
}

}

3、button属于frame的成员变量时
package swing;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class Demo5 {
public static void main(String[] args) {
JFrame jf=new MyJFrame("test");
jf.pack();
jf.setVisible(true);
}

}

class MyJFrame extends JFrame
{
private JButton jb=new JButton("按下");
public MyJFrame(String str)
{
super(str);
jb.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
MyJFrame.this.setTitle("gg"); //jb属于MyFrame类的成员变量,则通过MyJFrame.this方式引用MyFrame类的当前实例
}
});
this.add(jb);
}
}

多谢提醒。我想我该好好看书了、这都是基础语法。 求助使用匿名内部类实现事件处理

#4


进来复习一下基础知识!

#5


引用 2 楼 huntor 的回复:
final JFrame frame = new JFrame("...");
final JTextField input = new JTextField();
final JButton click = new JButton("Update Title");
... // add component to frame
click.addActionListener(new ActionListener(){
    @Override public void actionPerformed(ActionEvent e){
        frame.setTitle(input.getText());
    }
});

求助为按钮设置快捷键,我想为一个按钮设置回车为快捷键,不需要按alt的那种,下面尝试为何失败了,求指导
Action sendMessege = new AbstractAction() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
displayArea.append(editArea.getText()+"\n");
editArea.setText("");
editArea.requestFocus();
}
};

sendButton.addActionListener(sendMessege);
sendButton.registerKeyboardAction(sendMessege, 
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), JComponent.WHEN_IN_FOCUSED_WINDOW);

/*这是另一种方法。也没成功
InputMap inputMap = sendButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(KeyStroke.getKeyStroke((char)(KeyEvent.VK_ENTER)), "send");
sendButton.getActionMap().put("send", sendMessege);

sendButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {

}
});
*/

#6


引用 5 楼 u010749411 的回复:
Quote: 引用 2 楼 huntor 的回复:

final JFrame frame = new JFrame("...");
final JTextField input = new JTextField();
final JButton click = new JButton("Update Title");
... // add component to frame
click.addActionListener(new ActionListener(){
    @Override public void actionPerformed(ActionEvent e){
        frame.setTitle(input.getText());
    }
});

求助为按钮设置快捷键,我想为一个按钮设置回车为快捷键,不需要按alt的那种,下面尝试为何失败了,求指导
Action sendMessege = new AbstractAction() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
displayArea.append(editArea.getText()+"\n");
editArea.setText("");
editArea.requestFocus();
}
};

sendButton.addActionListener(sendMessege);
sendButton.registerKeyboardAction(sendMessege, 
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), JComponent.WHEN_IN_FOCUSED_WINDOW);

/*这是另一种方法。也没成功
InputMap inputMap = sendButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(KeyStroke.getKeyStroke((char)(KeyEvent.VK_ENTER)), "send");
sendButton.getActionMap().put("send", sendMessege);

sendButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {

}
});
*/
按钮有焦点才行。
看看 JRootPane的setDefaultButton方法

#7


按钮有焦点才行。
看看 JRootPane的setDefaultButton方法

当我在编辑框中编辑时,编辑框具有焦点。按钮没有焦点,怎么做到按下回车启动按钮?