返回信息流代码是这样。如果不想用内部类,怎么样使我的actionPerformed方法访问到我的变量canvas。不使用内部类就会在我加重斜体的地方报错。
package com.dishiliuzhang;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class test16_1 extends JFrame{
/**
* @param args
*/
private JButton jb1=new JButton("enlarge");
private JButton jb2=new JButton("shrink");
private Cicle canvas=new Cicle();
public test16_1()
{
JPanel jp=new JPanel();
jp.add(jb1);
jp.add(jb2);
add(canvas);
add(jp,BorderLayout.SOUTH);
jb1.addActionListener(new Enlarge());
jb2.addActionListener(new Enshrink());
}
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame frame=new test16_1();
frame.setTitle("contrcircle");
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class Enlarge implements ActionListener
{
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
canvas.large();
}
}
class Enshrink implements ActionListener
{
@Override
public void actionPerformed(ActionEvent arg0 ) {
// TODO Auto-generated method stub
canvas.shrink();
}
}
class Cicle extends JPanel
{
private int radius=10;
public void large()
{
radius+=5;
repaint();
}
public void shrink()
{
radius-=5;
repaint();
}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawOval(getWidth()/2-5,getHeight()/2-5, radius, radius);
}
}
}
这是一条镜像帖。来源:北邮人论坛 / java / #46164同步于 2015/12/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
请教一个关于内部类的问题
zczz
2015/12/7镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这样?
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Test extends JFrame {
public Test() {
final Cicle canvas = new Cicle();
add(canvas);
JButton jb1 = new JButton("enlarge");
JButton jb2 = new JButton("shrink");
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
canvas.large();
}
});
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
canvas.shrink();
}
});
JPanel jp = new JPanel();
jp.add(jb1);
jp.add(jb2);
add(jp, BorderLayout.SOUTH);
}
public static void main(String[] args) {
JFrame frame = new Test();
frame.setTitle("contrcircle");
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class Cicle extends JPanel {
private int radius = 10;
public void large() {
radius += 5;
repaint();
}
public void shrink() {
radius -= 5;
repaint();
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawOval(getWidth() / 2 - 5, getHeight() / 2 - 5, radius, radius);
}
}
}
谢谢啊,不过这样子只是把内部类匿名了。我想要外部类的形式。比如那个扩大类和缩小类。把canvas可以传进去使用。就是在我的enlange类中使用我主类创建的canvas
【 在 axpq110 的大作中提到: 】
: 这样?
: [code=java]
: import javax.swing.*;
: ...................
问题是:你的那两个ActionListener,即Enlarge和Enshrink(应该叫shrink吧。用expand/shrink这两个词比较好),引用了canvas对象。但因为它不是test16_1的内部类,不能使用它的成员变量。所以要给它们一个引用。
给Enlarge创建一个构造方法,传入那个canvas:
class Enlarge implements ... {
private Circle canvas;
public Enlarge(canvas) { this.canvas = canvas; }
...
}
就可以了。Enshrink也一样处理。
当然,这么简单的消息处理,还是建议用沙发的方法,用内部类。甚至在java 1.8开始还可以用lambda表达式:
jb1.addActionListener((arg0) -> {canvas.large();});
jb2.addActionListener((arg0) -> {canvas.shrink();});
另外,有个设计模式叫mediator,好像专门适用这种情况: https://en.wikipedia.org/wiki/Mediator_pattern
2333 然后再这样?
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Test extends JFrame {
private int mRadius = 10;
public Test() {
JPanel canvas = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawOval(getWidth() / 2 - 5, getHeight() / 2 - 5, mRadius, mRadius);
}
};
add(canvas);
JButton jb1 = new JButton("enlarge");
JButton jb2 = new JButton("shrink");
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
mRadius += 5;
canvas.repaint();
}
});
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
mRadius -= 5;
canvas.repaint();
}
});
JPanel jp = new JPanel();
jp.add(jb1);
jp.add(jb2);
add(jp, BorderLayout.SOUTH);
}
public static void main(String[] args) {
JFrame frame = new Test();
frame.setTitle("contrcircle");
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
对,确实是这样的。谢谢
【 在 nuanyangyang 的大作中提到: 】
: 问题是:你的那两个ActionListener,即Enlarge和Enshrink(应该叫shrink吧。用expand/shrink这两个词比较好),引用了canvas对象。但因为它不是test16_1的内部类,不能使用它的成员变量。所以要给它们一个引用。
: 给Enlarge创建一个构造方法,传入那个canvas:
: [code=java]
: ...................
非常感谢。三楼明白了我的意思[ema23]
【 在 axpq110 的大作中提到: 】
: 2333 然后再这样?
: [code=java]
: import javax.swing.*;
: ...................
[ema23]