State<T extends JComponent>

State

Nimbus에서 내장 또는 커스텀 상태를 나타내요. Synth는 몇 가지 내장 상태를 제공해요: Enabled, Mouse Over, Pressed, Disabled, Focused, Selected, Default.

하지만 Look and Feel에서 표현할 수 있는 상태는 훨씬 더 많고, 이러한 다른 상태에 따라 컴포넌트를 다르게 스타일링하면 좋아요. 예를 들어 진행률 바는 "indeterminate"일 수 있어요. 이를 "상태(state)"로 정의할 수 있으면 매우 편리하겠죠. 이 클래스 State는 바로 그런 상황을 위해 설계되었어요. 추상 #isInState 메서드만 구현하면 돼요. 주어진 JComponent가 "이 상태 안에" 있으면 true, 그렇지 않으면 false를 반환해요. 이 메서드는 성능에 민감한 루프에서 여러 번 호출되므로 매우 빠르게 실행되어야 해요.

예를 들어 JProgressBar를 위한 커스텀 "Indeterminate" 상태 구현은 다음과 같을 수 있어요.

public final class IndeterminateState extends State<JProgressBar> {
    public IndeterminateState() {
        super("Indeterminate");
    }

    @Override
    protected boolean isInState(JProgressBar c) {
        return c.isIndeterminate();
    }
}

출처: Java API Reference

본문

State는 Nimbus에서 컴포넌트의 커스텀 상태를 표현하는 추상 클래스예요. 상태의 이름과, 컴포넌트가 그 상태인지 판별하는 isInState 메서드를 정의해요.

대표적인 시그니처는 다음과 같아요.

protected State(String name)
protected abstract boolean isInState(T c)

주요 메서드의 동작을 살펴볼게요.

  • State(String name) — 새 커스텀 상태를 생성해요. 상태의 이름을 지정하세요. 이름은 특정 컴포넌트의 상태 집합 안에서 고유해야 해요. 상태 이름은 UIDefaults에서 사용되는 이름과 일치해야 해요. 예를 들어 다음과 같은 것이 올바른 사용법이에요.
defaults.put("Button.States", "Enabled, Foo, Disabled");
defaults.put("Button.Foo", new FooState("Foo"));
  • isInState(T c) — 지정된 JComponent가 이 클래스가 나타내는 커스텀 상태 안에 있는지 여부를 반환해요. 이 메서드는 극도로 성능에 민감한 루프예요. 빠르게 실행되도록 적절한 주의를 기울이세요. Nimbus는 이 메서드를 사용해 JComponent가 어떤 상태인지 결정해요. 예를 들어 JProgressBar가 indeterminate일 때 true를 반환하는 커스텀 상태가 있을 수 있으며, 그 구현은 단순히 return c.isIndeterminate();가 돼요.

더 알아보기