Blackberry JDEフィールド変更リスナー
-
07-07-2019 - |
質問
Blackberry JDEでFieldChangeListenerを実装する方法については、ちょっと混乱しています。 1つの方法では、メインクラスにFieldChangeListenerを実装させ、次にその中にfieldchangedメソッドを持たせ、別の方法では私にさせます:
FieldChangeListener listenerUS = new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
System.out.println("Something changed!");
pushScreen(_newScreen);
}
};
どちらの方法でも、メソッド(pushScreen、または作成したカスタムメソッドなど)を呼び出そうとすると、ランタイムエラーが発生します。デバッグモードでは、printステートメントも表示されません。ただし、fieldChangedメソッドを完全に削除すると、コンパイルもされないので、コードが表示されていると確信していますか?かなり
次のようにして、リスナーをボタンに追加しました。
but_temp.setChangeListener(this);
(最初の場合)またはlistenerUSを配置します。
すべてが接続されているように見えますが、印刷ステートメントの一部が表示され、メソッドを呼び出すと実行時エラーが発生します。
これは理にかなっていますか?ブラックベリーでリスナーを使用する方法について完全に混乱していますか?
全体として私のコードのコピーがあります...
解決 3
非常に混乱していますが、なんとか修正することができました。最初から新しいクラスを作成し、古いコードをコピーして貼り付けました。すべてが機能します。変更した唯一のことは、Eclipseが必要だと言ったクラスのみをインポートすることでした(さまざまなチュートリアルなどからインポートステートメントを取得する前に、一部は使用されなかった可能性があります)。
物事をクラッシュさせていたものをインポートしていた可能性はありますか?
私は実際に自分のコードのほとんどを画面自体に入れたいのですが、それを試みるとロードする前にすべてがクラッシュします。私が使用しているxmlパーサーに関する何かが幸せではない。
変更されたコードがあります。私は本当にイライラしている。なぜなら、このフレームワークには固有の理解があり、私が不愉快ではないこと、そして私のトラブルのほとんどがこれに起因していることを知っているからだ。 ^ _ ^ ;;とはいえ、練習だけが助けになると思います。
他のヒント
私はあなたのコードを見ましたが、あからさまに間違ったことはありませんでした。ただし、メインアプリケーションクラスにFieldChangeListenerの役割を指定することはしません。意識する必要があるものではありません。私にできることは、ButtonFieldのFieldChangeListenerインターフェイスを実装するサンプルアプリを提供することです。これは解決策ではありませんが、コードの知識が豊富であれば、この例とは異なるものを選択できる可能性があります。役に立てば幸いです。
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.FieldChangeListener;
/**
* Test implementation of ButtonField.
*/
public class TestAppMain extends UiApplication
{
/**
* Default Constructor.
*/
private TestAppMain() {
pushScreen(new AppScreen());
}
/**
* App entry point.
* @param args Arguments.
*/
public static void main(String[] args) {
TestAppMain app = new TestAppMain();
app.enterEventDispatcher();
}
/**
* Main application screen.
*/
private static class AppScreen extends MainScreen
{
/**
* Default constructor.
*/
public AppScreen() {
LabelField title = new LabelField("Button Test Demo",
LabelField.ELLIPSIS | LabelField.USE_ALL_WIDTH);
setTitle(title);
// Create a button with a field change listener.
FieldChangeListener listener = new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
ButtonField buttonField = (ButtonField) field;
System.out.println("Button pressed: " + buttonField.getLabel());
}
};
ButtonField buttonField = new ButtonField("Test Button", ButtonField.CONSUME_CLICK);
buttonField.setChangeListener(listener);
add(buttonField);
}
/**
* Handle app closing.
*/
public void close() {
Dialog.alert("Goodbye!");
System.exit(0);
super.close();
}
}
}
Fostah(+1)に同意します。Field、Manager、またはScreenにFieldChangeListenerを実装するか、スタンドアロンのFieldChangeListenerを使用するのが一般的です。
また、フィールドから画面をプッシュ/プルするには:
UiApplication.getUiApplication().pushScreen(nextScreen);