每当更新变量时自动执行代码

时间:2012-06-14 15:50:21

标签: java objective-c cocoa-touch cocoa swing

假设我有一个包含一些数据的程序。一些整数值,例如{1,5,10,3}。该程序具有显示数据的GUI。每个整数都转换为字符串并显示为标签。程序的若干不同部分可以改变数据,例如,单击时增加值的按钮。每次更改值时,必须更新相应的标签以显示新值。

也许是一个更常见的场景:说我们有一个控件既可以改变数据又可以显示数据,例如:一个滑块。每次移动滑块时,我们都希望数据发生变化,并显示在标签中(或许多不同的标签)。但是还有其他方式可以改变数据,当它滑动时,滑动条应该移动。

对于Java Swing,目前最好的做法是什么,所以我们永远不会忘记更新标签?

Objective C Cocoa的相同问题。

4 个答案:

答案 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