假设我有一个包含一些数据的程序。一些整数值,例如{1,5,10,3}。该程序具有显示数据的GUI。每个整数都转换为字符串并显示为标签。程序的若干不同部分可以改变数据,例如,单击时增加值的按钮。每次更改值时,必须更新相应的标签以显示新值。
也许是一个更常见的场景:说我们有一个控件既可以改变数据又可以显示数据,例如:一个滑块。每次移动滑块时,我们都希望数据发生变化,并显示在标签中(或许多不同的标签)。但是还有其他方式可以改变数据,当它滑动时,滑动条应该移动。
对于Java Swing,目前最好的做法是什么,所以我们永远不会忘记更新标签?
Objective C Cocoa的相同问题。
答案 0 :(得分:6)
我首先看看观察者的设计模式。
您可以观察数据的变化并相应地更新UI。每种语言都有不同的实现方式。
答案 1 :(得分:6)
我认为在Swing中最常用的方法是使用PropertyChangeListeners。
答案 2 :(得分:1)
任何Swing UI小部件都可以解决此问题。它们都有一个视图侧和一个模型侧(例如JTable
是表的视图侧,TableModel
是模型侧。)
如果您想对数据进行更改,并确保更新UI,请在模型侧进行更改,Swing负责其余部分。你可以采取相同的方法。有一个模型来支持您的视图,并确保模型上发生所有更改。然后,视图元素应该将侦听器注册到该模型,并在需要时自行更新(基本上,tjg184建议的Observer模式)
答案 3 :(得分:0)
Objective c
中有委托模式VariableChanger.h
@protocol VariableChangedProtocol
-(void) variableDidChange;
@end
@interface VariableChangerClass : NSObject
{
id<VariableChangedProtocol> delegate;
int exampleVariable;
}
@property int exampleVariable;
-(id) initWithDelegate:(id<VariableChangedProtocol>) target;
@end
VariableChanger.m
@implementation
@synthesize exampleVariable;
-(id) initWithDelegate:(id<VariableChangedProtocol>) target
{
self = [super init];
if (self)
{
delegate = target;
}
}
-(void) setExampleVariable:(int) newValue
{
if(newValue != exampleVariable)
exampleVariable = newValue;
[delegate variableDidChange];
}
@end
VariableChangedListener.m
@implementation VariableChangedListener
-(id) init
{
self = [super init];
if (self)
{
VariableChangerClass *v = [[VariableChangerClass alloc] initWithDelegate:self];
}
return self;
}
-(void) variableDidChange
{
NSLog(@"The variable changed");
}
@end