返回信息流简而言之,层层嵌套,到处都是内部类。
那个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)
}
}
}
这是一条镜像帖。来源:北邮人论坛 / java / #13925同步于 2010/4/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
学了Scala,染上了这种编码风格,波及我的Java编程:
wks
2010/4/9镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。