我有 4 个自定义微调器,用于修改一个选定小部件的宽度、高度、X 位置和 Y 位置。我的小部件可以在屏幕上四处拖动,我的想法是使用这些微调器来更改某些属性,例如宽度或高度,并立即查看更改的效果。 是否有一种模式可用于仅用一个替换所有这些类(XSpinnerListener、YSpinnerListener...)并指示我当前对象(JButton)的哪个属性需要更改?这是一个好的设计方法吗?
public void init(){
widthSpinner.setListener(new WidthSpinnerListener());
heightSpinner.setListener(new HeightSpinnerListener());
xSpinner.setListener(new XSpinnerListener());
ySpinner.setListener(new YSpinnerListener());
}
public class XSpinnerListener implements SpinnerListener {
@Override
public void spinnerValueChanged() {
current.setLocation(xSpinner.getValue(), current.getY());
}
}
public class YSpinnerListener implements SpinnerListener {
@Override
public void spinnerValueChanged() {
current.setLocation(current.getX(), ySpinner.getValue());
}
}
public class WidthSpinnerListener implements SpinnerListener {
@Override
public void spinnerValueChanged() {
current.setSize(widthSpinner.getValue(), current.getHeight());
}
}
public class HeightSpinnerListener implements SpinnerListener {
@Override
public void spinnerValueChanged() {
current.setSize(current.getWidth(), heightSpinner.getValue());
}
}
最佳答案
一些沉思......
您可以通过为您的 SpinnerListener spinnerValueChanged(...)
方法提供一个 SpinnerEvent 参数来模拟 Swing 的设计,该参数指示正在更改的轴。轴可以用枚举封装,...
enum Axis {
X("X"), Y("Y"), WIDTH("Width"), HEIGHT("Height");
private String name;
private Axis(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
SpinnerEvent 参数类可能类似于:
class SpinnerEvent {
private Object source;
private Axis axis;
private int value;
public SpinnerEvent(Object source, Axis axis, int value) {
this.source = source;
this.axis = axis;
this.value = value;
}
public Object getSource() {
return source;
}
public Axis getAxis() {
return axis;
}
public int getValue() {
return value;
}
}
您的 SpinnerListener 接口(interface)(您没有向我们展示)必须更改:
interface SpinnerListener {
public void SpinnerValueChanged(SpinnerEvent e);
}
也许您的具体实现可以在实现 Movable 接口(interface)的对象上工作:
interface Movable {
public abstract int getX();
public abstract void setX(int x);
public abstract int getY();
public abstract void setY(int y);
public abstract int getWidth();
public abstract void setWidth(int width);
public abstract int getHeight();
public abstract void setHeight(int height);
public abstract void move(Axis axis, int value);
}
使用关键方法,可以像这样实现的移动:
@Override
public void move(Axis axis, int value) {
switch (axis) {
case X:
x += value;
break;
case Y:
y += value;
break;
case WIDTH:
width += value;
break;
case HEIGHT:
height += value;
default:
break;
}
}
小的具体实现
class ConcreteSpinnerListener implements SpinnerListener {
private Movable movable;
public ConcreteSpinnerListener(Movable movable) {
this.movable = movable;
}
@Override
public void SpinnerValueChanged(SpinnerEvent e) {
movable.move(e.getAxis(), e.getValue());
}
}
关于java - 更改一个对象的属性时替换重复代码的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30146598/