[SWT/JFace] Mały problem z InputDialog

0

Hej mam następujący problem.

Tworzę sobie InputDialog:

InputDialog dialog = new InputDialog(Display.getCurrent().getActiveShell(), "Tworzenie nowej gałęzi",
								"Proszę podać nazwę gałęzi", "", getNameValidator((DeviceNodes) selected));

public IInputValidator getNameValidator(final DeviceNodes parent) {
			IInputValidator validator = new IInputValidator() {

				private boolean checkIfExists(String text) {
					Session session = HibernateUtilLocal.getSessionFactory()
							.openSession();
					Criteria criteria = session.createCriteria(DeviceNodes.class);

					criteria.add(Restrictions.eq("deviceNodes", parent));
					criteria.add(Restrictions.eq("deviceNodeName", text));
					if (!criteria.list().isEmpty()) {
						session.close();
						return true;
					} else {
						session.close();
						return false;
					}
				}

				public String isValid(String text) { // return an error message,
					if (text.isEmpty()) // or null for no error
						return "Nazwa gałęzi nie może być pusta";
					else if (checkIfExists(text))
						return "Istnieje już gałąź o tej nazwie";
					
					return null;
				}
			};
			
			return validator;
	}

Jeśli tworzę dialog bez validatora to wszystko jest ok. Natomiast gdy dołożę validator (nawet z samym sprawdzaniem pustego stringa) to nie mogę nacisnąć OK za pomocą myszki. Mogę nacisnąć ENTER, ale myszką zatwierdzić nie mogę.

Macie jakieś pomysły? Bo google nie pomogło niestety

0

Nie możesz nacisnąć dlatego, że button jest nieaktywny (z powodu niepoprawnego wejścia), czy może coś się wiesza? Jeśli to pierwsze, to dziwne jest, że dialog reaguje wtedy na enter. Nie wiem też, co dokładnie robi metoda checkIfExists. Dzieje się tak zawsze, czy tylko po wpisaniu konkretnego ciągu (poprawnego/niepoprawnego)?

0

Uf już myślałem, że nikt się nie zainteresuje :). Dzięki za odzew.

Wejście jest w tym momencie poprawne (żadna z dwóch informacji o możliwych błędach wtedy się nie wyświetla). Funkcja checkIfExists() sprawdza czy jest już taki wpis w bazie danych, też wstępnie myślałem, że to może wina zaprzęgnięcia w tym miejscu Hibernate'a, ale po zakomentowaniu tego fragmentu sytuacja jest dalej taka sama.

Jeśli ciąg jest niepoprawny to wszystko jest ok, przycisk jest nieaktywny. Natomiast po wpisaniu ciągu poprawnego kliknięcie Enter zatwierdza wpis, wszystko wtedy śmiga. Nie można niestety zatwierdzić naciskając przycisk myszy. Przycisk Cancel działa bez zarzutu. No i wszystko działa bez walidatora, więc to najwyraźniej jego wina.

Zrobiłem jeszcze test komentując wszystko w walidatorze tak że zawsze zwraca null. Wtedy działa. Psuje się po pierwszym momencie w którym nie przechodzi weryfikacji. Potem jak się zmieni wejście na coś poprawnego już nie można przyciskiem myszy zatwierdzić.

Z góry dzięki za wszystkie rady

0

Może sprawdź wewnątrz isValid(), czy metoda jest wtedy wykonywana. Jeśli tak, to teoretycznie button powinien się wtedy aktywować. I jeśli Dialog nie jest w żaden sposób modyfikowany, to taki błąd nie powinien mieć miejsca, ale może ModifyListener tego pola tekstowego (dodawany wewnątrz klasy InputDialog) w ogóle nie łapie zmian. Jakbyś mógł, pokaż większy kawałek kodu, bo u mnie wszystko śmiga i nie potrafię doprowadzić do tego błędu.

0

Ok napisałem kawałek testowego kodu niezależnego od aplikacji. Sypie się tak samo:

package app;

import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class Test {
	
	public static void main(String[] args) {
		Display display = new Display ();
		Shell shell = new Shell(display);
	 
		Text helloWorldTest = new Text(shell, SWT.NONE);
		helloWorldTest.setText("Hello World SWT");
		helloWorldTest.pack();
		
		InputDialog dialog = new InputDialog(shell, "Tworzenie nowego urządzenia",
							"Proszę podać nazwę urządzenia", "", new IInputValidator() {

								public String isValid(String text) {
									if(text.equals("test"))
										return "Blad";
									return null;
								}
			
		});
		
		
	 
		shell.pack();
		shell.open ();
		
		dialog.open();
		while (!shell.isDisposed ()) {
			if (!display.readAndDispatch ()) display.sleep ();
		}
		display.dispose ();

		
		
	}
}

Trochę specyfikacji:
org.eclipse.swt 3.3.0-v3346
org.eclipse.jface 3.3.0-I20070606-0010

Wszystko śmiga na linuksie (nie sprawdzałem na windowsie jeszcze), więc jest też:
org.eclipse.swt.gtk.linux 3.3.0-v3346

Może to wina tych wersji jface/swt? Są jakieś nowsze? Te mam z repo mavena ściągnięte.

0

U mnie działa. Biblioteki swt i jface, z których korzystami i które mam dołączone do Eclipse, są u mnie w wersji 3.6 (jak samo IDE).

0

Ok jutro spróbuję ściągnąć nowsze paczki. Dzięki za sprawdzenie

0

Ok udało mi się dzisiaj to wszystko skompilować pod windowsa, odpaliłem i tam śmiga. Tak więc najwyraźniej jest to jakiś błąd paczek swt/jface pod linuxa. Myślicie, że dobrze by było to gdzieś zgłosić? Niby problem nie jest jakiś super poważny, no ale jednak jest to błąd.

0

Myślę, że można by to zgłosić na Bugzilli Eclipsa.

0

Jakby ktoś miał ten sam problem to rozwiązaniem jest ustawienie zmiennej środowiskowej
GDK_NATIVE_WINDOWS=1.

1 użytkowników online, w tym zalogowanych: 0, gości: 1