2014-12-17 10 views
8

Taranan herhangi bir grafiği alacağı ve değerlerini bir CSV'ye dönüştürecek bir grafik okuyucu programı oluşturmaya çalışıyorum. Aşağıdaki grafik temel kontrol benim temel gereksinimleri yerine getiren bir yukarı prototip ve çalışan varGUI durumlarını ve alt kümelerini koruyun ve kontrol edin

enter image description here

akış açıklar, ancak gelişimini devam etmeden önce GUI devletleri ve substates korumak için en iyi yolu bilmek istiyorum . Şu anda bir enum kullanıyorum:

public enum UIState { 
    MAKING_SELECTION, SELECTING_AXIS_POINTS, SETTING_VALUES, SELECTING_GRAPH_POINTS 
} 

denetleyici vardır

public void setUiState(UIState uiState) { 
    switch (this.uiState = uiState) { 
     case MAKING_SELECTION: 
      frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 
      break; 
     case SELECTING_AXIS_POINTS: 
      clearSelection(); 
      frame.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR)); 
      break; 
     case SETTING_VALUES: 
      clearSelection(); 
      break; 
     case SELECTING_GRAPH_POINTS: 
      frame.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR)); 
      clearSelection(); 
      break; 
    } 

    updateView(); //Repaints frame 
    setChanged(); 
    notifyObservers(uiState); 
} 

Benim OptionsPanel arayarak düğmeleri ve fare dinleyici tarafından ayarlanabilir bir UIState, tüm düğmeleri ve giriş içeriyor paneli alanlar, kontrolör gözlemler ve değiştirmek gözlemler ise büyük bir anahtarı çağırır:

@Override 
public void update(Observable o, Object arg) { 
    if (arg instanceof UIState) { 
     switch ((UIState)arg) { 
      case MAKING_SELECTION: 
       //Set component statuses 
       break; 
      case SELECTING_AXIS_POINTS: 
       //Set component statuses 
       break; 
      case SETTING_VALUES: 
       //Set component statuses 
       break; 
      case SELECTING_GRAPH_POINTS: 
       //Set component statuses 
       break; 
     } 
    } 
} 

bileşenlerin ayararayarak hemen yapılır Düğümlerimin ve metin alanlarının her birinde, az miktarda bileşenle zaten belirsiz hale geliyor. Benim fare dinleyicileri de, her şeyi gerçekten kafa karıştırıcı yapan isLeftMouseButton() ve isRightMouseButton() sorgularına ek olarak benzer anahtarlara sahiptir.

Benim uygulamamın alt satırlar bile içermiyor ve şu anda çalışmam var olsa bile, imlecin ayarlanmasıyla zaten tutarsızlık var.

Bu yüzden sorum şu: Bu GUI durumlarını sürdürmek ve daha düşük tutarlılık sağlayan daha kolay bir kullanıcı girişine dayalı kullanıcı arabirimi durumunu ve alt girişlerini ayarlamak için daha iyi bir çözüm var mı? hangi temsilci görev yürütme için beton Devletler için

http://en.wikipedia.org/wiki/State_pattern

Sen genel amaçlı giriş dinleyicileri vardır:

+3

Güzel düzenleme. Artı bir .. –

+5

Belki de durum tasarım desenine bakın? http://en.wikipedia.org/wiki/State_pattern –

+0

@MattCoubrough, eğer doğru bir şekilde anladıysam, "getCursor()" veya "changePanelCompStates (OptionPanel panel)" gibi soyut yöntemlere sahip olacak bir arayüze sahip olurdum. UI devlet sınıfları tarafından uygulanabilir. Yine de dinleyicileri nasıl dinleyebilirim? Bu devlet sınıflarının her biri, devlet her değiştiğinde benim panelimden eklenecek ve çıkarılacak kendi dinleyicilerine sahip olur mu? – Marv

cevap

3

Bunu halletmenin en iyi yolu Devlet tasarım deseni kullanmaktır. O zaman mevcut beton devlet hangisi olursa olsun, girişi kendi kendine özgü bir şekilde ele alır. Kavramın nasıl uygulanacağı konusunda birçok varyasyon var. Ancak ana fikir, uygulama durumu değiştiğinde, farklı bir Devlet nesnesinin "mevcut Devlet" haline gelmesi ve girdiyi ele almaktan sorumlu olmasıdır.

Örneğin: bir mouseMove() olay işleyicisinde currentState.mouseMove(evt) numaralı telefonu arayın ve geçerli durum nesnesinin mouseMove anahtarını kullanmaya gerek duymadan anahtar bildirimlerine gerek kalmasını sağlayın.

İlgili konular