JavaFX ile Java 8'de EventHandler<ActionEvent>
'un daha basit bir sürümünü sağlamaya çalışıyorum. onlar parametre olarak olayı yapmayız, onlar gizleme umurumda:Bir Lambda yöntemi ile olayı basitleştirme Java'da çalışmıyor
son hali Bununla
package dialogutil;
import org.controlsfx.dialog.Dialog;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
@FunctionalInterface
public interface Clickable extends EventHandler<ActionEvent> {
public static Clickable EMPTY =() -> {};
public void onClick();
@Override
public default void handle(ActionEvent event) {
this.onClick();
if (event != null && event.getSource() != null) {
((Dialog)event.getSource()).hide();
}
}
}
gibi bakmak gerekiyordu, ben daha basit bir şekilde olay işleyicileri oluşturmak çalışıyorum kendilerini. Aşağıdaki bekliyoruz
İştepackage test;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import org.junit.Test;
public class BastelTest {
/**
* Interface Complicated is called with a value.
*/
@FunctionalInterface
interface Complicated {
void complicated(int value);
}
/**
* Interface Simple is called without a value.
*/
@FunctionalInterface
interface Simple extends Complicated {
void simple();
/**
* The value given is printed and then the call is deflected to the simple method given.
*/
@Override
default void complicated(int value) {
System.out.println("Swallowing the " + value);
simple();
}
}
/**
* This is in order to try the Complicated/Simple interface.
* The given {@link Complicated} is called with a 42.
* It can be a {@link Simple} as well; in this case the call is deflected.
* @param x
*/
private void callIt(Complicated x) {
x.complicated(42);
}
/**
* This is the interface I am indeed working on.
* Here the deflection doesn't work; instead, I get an AbstractMethodError.
*/
@FunctionalInterface
public interface Clickable extends EventHandler<ActionEvent> {
public static Clickable EMPTY =() -> {};
public void onClick();
@Override
public default void handle(ActionEvent event) {
System.out.println("Simplifying the call:");
this.onClick();
System.out.println("Call simplified.");
}
}
private void handle(EventHandler<ActionEvent> x) {
System.out.println("Handling null event via " + x);
x.handle(null);
System.out.println("Handling nonnull event via " + x);
x.handle(new ActionEvent());
}
@Test
public void testFunc() {
callIt(x -> System.out.println("Complicated with " + x));
callIt((Simple)() -> System.out.println("Called simple."));
Clickable c =() -> System.out.println("Hdl3");
c.handle(null);
handle(x -> System.out.println("Hdl1 " + x));
handle((Clickable)() -> System.out.println("Hdl2"));
handle(Clickable.EMPTY);
}
}
gerçekleşmesi: gösteri uğruna
, ben bununla sahip sorunu yeniden bir test seti oluşturdu- ben
callIt()
ararsam ya İşleyici temel sürümü ilehandle()
, her zamanki gibi denir. - Onları "uzman", işleyici sınıfının basitleştirilmiş sürümüyle çağırırsam, bu çağrıyı verdiğim basitleştirilmiş sürümüne yönlendirmesini beklerim.
Bu kısmen çalışır: Simple
baskı verilen bağımsız değişken bölgesinin complicated(int)
yöntemini ve daha sonra da bir simple()
yöntem olup, ifade çağırır: Simple
/Complicated
kombinasyonu ile
- , çalışır bir lambda olarak. Bununla birlikte, bundan sonra olan kombinasyon, bir
EventHandler<ActionEvent>
'u, birClickable
olan vehandle()
buonClick()
olarak adlandırılan bir lambda (muhtemelen boş) olarak ifade etmektedir. (Lütfen isimler hakkında kafanız karışmayın; sadece geliştireceğim, fakat tamamen değişmeyecek, oldukça tarihi bir arayüz.) Bu durumda işe yaramıyor. İşte
yığın izleme alıyorum edilir:
java.lang.AbstractMethodError: Method test/BastelTest$$Lambda$7.handle(Ljavafx/event/Event;)V is abstract
at test.BastelTest$$Lambda$7/25282035.handle(Unknown Source)
at test.BastelTest.handle(BastelTest.java:38)
at test.BastelTest.testFunc(BastelTest.java:69)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at [usual test case stuff...]
Neden çalışmıyor? Sıradan bir Java işlemleri kullanılarak
(Ben durum hakkında yeterince açık değil isem, bunu söyle.)
Hatanızı JDK 1.8.0_74 ile yeniden oluşturamıyorum. Hangi versiyona sahipsin? Ayrıca, bu ilişkisizdir, ancak 'Basit bir şekilde Karmaşık' arabirimi 'gerçekten garip görünüyor (eğer basit bir şey karmaşıksa?) – Tunaki
İlişkisiz. 'public static Clickable.EMPTY' - 'interface'lerdeki değişkenlere izin verilmez,' EMPTY 'dolaylı olarak' public static final 'olur. 'publicClick onClick()' burada 'public' gereksizdir. –
1.8.0_20 sahibim. İyi fikir - Çalışıp çalışmadığını görmek için güncellemeliyim ... – glglgl