1

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

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

对于 Java Swing,目前自动执行此操作的最佳实践是什么,以便我们永远不会忘记更新标签?

Objective C Cocoa 的同样问题。

4

4 回答 4

6

我认为在 Swing 中最常见的方法是使用PropertyChangeListeners

于 2012-06-14T15:58:36.650 回答
6

我将首先看一下观察者设计模式。

您可以观察数据的变化并相应地更新 UI。每种语言都有不同的实现方式。

于 2012-06-14T15:53:46.267 回答
1

这个问题在任何 Swing UI 小部件中都得到了解决。它们都有一个视图端和一个模型端(例如,aJTable是表的视图端,其中TableModel是模型端)。

如果您想对数据进行更改,并确保您的 UI 已更新,您可以在模型端进行更改,而 Swing 会负责其余的工作。你可以采取同样的方法。有一个模型来支持您的视图,并确保所有更改都发生在模型上。然后,视图元素应该向该模型注册侦听器,并在需要时自行更新(基本上,tjg184 建议的观察者模式)

于 2012-06-14T18:46:59.913 回答
0

Objective c中有委托模式

变量转换器.h

@protocol VariableChangedProtocol

-(void) variableDidChange;

@end

@interface VariableChangerClass : NSObject
{
    id<VariableChangedProtocol> delegate;
    int exampleVariable;
}

@property int exampleVariable;

-(id) initWithDelegate:(id<VariableChangedProtocol>) target;

@end

变量转换器.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
于 2012-06-14T16:06:23.797 回答