BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #13925同步于 2010/4/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

学了Scala,染上了这种编码风格,波及我的Java编程:

wks
2010/4/9镜像同步2 回复
简而言之,层层嵌套,到处都是内部类。 那个Mediator是设计模式,不过这里只不过是为了称呼方便。毕竟Java里面内部类不能修改外部的局部变量。 提示: new MyClass() {{ // 这里其实是默认构造方法 }} 规范的应该这么写(但是罗嗦): new MyClass() { { // 这里其实是默认构造方法 } } Java代码: package gui; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.*; import javax.swing.event.*; public class JimpleWindow { private class Mediator { private String name = "world"; private int age = 10; public String getName() { return name; } public void setName(String name) { this.name = name; System.out.println("Name changed: "+name); } public int getAge() { return age; } public void setAge(int age) { this.age = age; System.out.println("Age changed: "+age); } } private Mediator mediator = new Mediator(); @SuppressWarnings("serial") private JFrame top() { return new JFrame() { { setDefaultCloseOperation(EXIT_ON_CLOSE); setLayout(new BorderLayout()); add(new JToolBar() {{ add(new JButton("foo")); add(new JButton("bar")); }},BorderLayout.NORTH); add(new JPanel() {{ setLayout(new GridLayout(3,2)); add(new JLabel("Name")); add(new JTextField(mediator.getName()) {{ addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { mediator.setName(getText()); } }); addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) { mediator.setName(getText()); } @Override public void focusGained(FocusEvent e) { // Do nothing. } }); }}); add(new JLabel("Age")); add(new JSpinner(new SpinnerNumberModel(mediator.age, 0, 100, 1)) {{ addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { mediator.setAge((Integer) getValue()); } }); }}); add(new JLabel("Confirm")); add(new JButton("Click me") {{ addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { System.out.println("Hello, "+mediator.getName()+"! You are "+mediator.getAge()+" years old."); } }); }}); }},BorderLayout.CENTER); pack(); }}; } /** * @param args */ public static void main(String[] args) { new JimpleWindow().top().setVisible(true); } } 等价的Scala供参考 package gui import javax.swing._ import javax.swing.event._ import scala.swing._ import scala.swing.event._ object SimpleWindow extends SimpleSwingApplication { object Mediator { private var _name : String = "world"; private var _age : Int = 0; def name = _name; def name_= (value: String) = { _name = value; println("Name changed: " + _name); } def age = _age; def age_= (value: Int) = { _age = value; println("Age changed: " + _age); } } override def top = new MainFrame { title="Hello world!"; contents=new BorderPanel { add(Component.wrap( new javax.swing.JToolBar { add(new Button("foo").peer) add(new Button("bar").peer) } ), BorderPanel.Position.North) add(new GridPanel(3,2) { contents += new Label("Name") contents += new TextField(Mediator.name,5) { listenTo(this) reactions+= { case EditDone(_) => Mediator.name = text; } } contents += new Label("Age") contents += Component.wrap(new JSpinner( new SpinnerNumberModel(Mediator.age,0,100,1)) with ChangeListener { override def stateChanged(e:ChangeEvent) = { Mediator.age = getValue().asInstanceOf[Int]; } addChangeListener(this) }) contents += new Label("Confirm") contents += new Button { text = "Click me!"; listenTo(this) reactions += { case ActionEvent(_) => { println("Hello, "+Mediator.name+"! You are "+Mediator.age+" years old."); } } } }, BorderPanel.Position.Center) } } }
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
Yamauchi机器人#1 · 2010/4/11
lz学习王.......
Ypy机器人#2 · 2010/4/11
强人