1

こんにちは、cp5.addNumberbox を使用してこれを行う方法を既に尋ねられましたが、別のオプションを試してみましたが、それでも cp5.addTextfield に勝てませんでした。何も機能しません!タスクは次のとおりです。 1)。数値を入力するときは、minValue フィールドが MaxValue フィールドを超えてはなりません。2)。数値を入力するときは、MaxValue フィールドを minValue フィールドより小さくすることはできません。3)。minValue フィールドは、maxValue フィールドの範囲を 500 単位超えてはなりません。私は狂信的ではなく、コードの最も単純なバージョンを投稿します。 ここに画像の説明を入力

import controlP5.*;

ControlP5 cp5;

// range constants
final int RANGE_MIN = 4000;
final int RANGE_MAX = 5000;
// the smallest allowed difference between min/max values
final int RANGE_MIN_DIFFERENCE = 500;
final int RANGE_MID = RANGE_MIN + ((RANGE_MAX - RANGE_MIN) / 2);

int minValue;
int maxValue;

Textfield inputMin;
Textfield inputMax;

void setup() {
  size(700, 400);

  PFont font = createFont("arial", 18);

  cp5 = new ControlP5(this);

  inputMin = cp5.addTextfield("minValue")
    .setPosition(100, 100)
    .setSize(100, 20)
    .setFont(font)
    //.setScrollSensitivity(1.1)
    // set initial acceptable range
    .setMin(RANGE_MIN)
    .setMax(RANGE_MAX)
    // set default value
    .setValue(4000)
    ;

  inputMax = cp5.addTextfield("maxValue")
    .setPosition(100, 150)
    .setSize(100, 20)
    .setFont(font)
    //.setScrollSensitivity(1.1)
    // set initial acceptable range
    .setMin(RANGE_MIN)
    .setMax(RANGE_MAX)
    // set default value
    .setValue(RANGE_MID + 1)
    ;


  textFont(font);
}

void draw() {
  constrainRangeInputs();
  background(0);
  fill(255);
  text("minValue: " + minValue + "\n" +
    "maxValue: " + maxValue, 10, 15);
}

void constrainRangeInputs() {
  int rangeMinInt = (int)inputMin.getValue();
  int rangeMaxInt = (int)inputMax.getValue();
  // 
  if (abs(rangeMaxInt - rangeMinInt) < RANGE_MIN_DIFFERENCE) {
    if (rangeMaxInt > RANGE_MID) {
      inputMin.setValue(rangeMaxInt - RANGE_MIN_DIFFERENCE);
    } else {
      inputMax.setValue(rangeMinInt + RANGE_MIN_DIFFERENCE);
    }
  }
}
4

1 に答える 1

2

あなたの質問の言い回しは、あなたの仕事を他の誰かに指示しているように聞こえます。あなたは目標を述べましたが、次のことを述べていません。

  • あなたが経験している問題は何ですか (「何も機能しません!」は、あなたを助けようとしている人には何も言いません)
  • 問題を解決するために何を試みましたか (予想される動作と実際の動作は何か)

コードを実行しましたが、フィールドに入力した後、次のエラーが表示されます。

java.lang.IllegalArgumentException: Can not set int field sketch_201009b.minValue to java.lang.String
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
    at sun.reflect.UnsafeIntegerFieldAccessorImpl.set(UnsafeIntegerFieldAccessorImpl.java:98)
    at java.lang.reflect.Field.set(Field.java:764)
    at controlP5.ControlBroadcaster.invokeField(Unknown Source)
    at controlP5.ControlBroadcaster.callTarget(Unknown Source)
    at controlP5.ControlBroadcaster.broadcast(Unknown Source)
    at controlP5.Controller.broadcast(Unknown Source)
    at controlP5.Controller.broadcast(Unknown Source)
    at controlP5.Textfield$Enter.execute(Unknown Source)
    at controlP5.Textfield.keyEvent(Unknown Source)
    at controlP5.ControllerGroup.keyEvent(Unknown Source)
    at controlP5.ControlWindow.handleKeyEvent(Unknown Source)
    at controlP5.ControlWindow.keyEvent(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at processing.core.PApplet$RegisteredMethods.handle(PApplet.java:1411)
    at processing.core.PApplet.handleMethods(PApplet.java:1613)
    at processing.core.PApplet.handleKeyEvent(PApplet.java:2949)
    at processing.core.PApplet.dequeueEvents(PApplet.java:2602)
    at processing.core.PApplet.handleDraw(PApplet.java:2440)
    at processing.awt.PSurfaceAWT$12.callDraw(PSurfaceAWT.java:1557)
    at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:313)

これがあなたの問題だと思います。

この回答Numberbox3 番目の例のコンポーネントを単純に置き換えただけのようですが、コンポーネント間の違いに注意を払っていないようです。TextField

  • ナンバーボックスは数字で動作します
  • TextField はテキストで動作します

前述のように、ControlP5 には十分なドキュメント(および例) があります。ドキュメントの使用方法を学び (これはサンプル ビデオです。Java/Processing/ドキュメント付きの他の言語/ライブラリにも同じことが当てはまります)、それを使用します。

あなたが試すことができる少なくとも次のようなものです:

import controlP5.*;

ControlP5 cp5;

// range constants
final int RANGE_MIN = 4000;
final int RANGE_MAX = 5000;
// the smallest allowed difference between min/max values
final int RANGE_MIN_DIFFERENCE = 500;
final int RANGE_MID = RANGE_MIN + ((RANGE_MAX - RANGE_MIN) / 2);

int minValue;
int maxValue;
String minValueString;
String maxValueString;

Textfield inputMin;
Textfield inputMax;

void setup() {
  size(700, 400);

  PFont font = createFont("arial", 18);

  cp5 = new ControlP5(this);

  inputMin = cp5.addTextfield("minValueString")
    .setPosition(100, 100)
    .setSize(100, 20)
    .setFont(font)
    ;

  inputMax = cp5.addTextfield("maxValueString")
    .setPosition(100, 150)
    .setSize(100, 20)
    .setFont(font)
    ;


  textFont(font);
}

void draw() {
  constrainRangeInputs();
  background(0);
  fill(255);
  text("minValue: " + minValue + "\n" +
       "maxValue: " + maxValue, 10, 15);
}

void constrainRangeInputs() {
  int rangeMinInt = int(inputMin.getText());
  int rangeMaxInt = int(inputMax.getText());
  // 
  if (abs(rangeMaxInt - rangeMinInt) < RANGE_MIN_DIFFERENCE) {
    if (rangeMaxInt > RANGE_MID) {
      inputMin.setText((rangeMaxInt - RANGE_MIN_DIFFERENCE) + "");
    } else {
      inputMax.setText((rangeMinInt + RANGE_MIN_DIFFERENCE) + "");
    }
  }
}

この部分に注目してください:

inputMin = cp5.addTextfield("minValueString")
inputMax = cp5.addTextfield("maxValueString")

これが以前のエラーの原因です。ControlP5 はminValueNumberboxコンポーネント名から上部のスケッチのint minValue;プロパティにマップしようとしましたが、 (のようにTextField) ではなく、文字列を処理しています ( であるため) 。intNumberbox

また、String から int への処理:

  int rangeMinInt = int(inputMin.getText());
  int rangeMaxInt = int(inputMax.getText());

個人的には、この非効率的でエラーが発生しやすいパスを使用したり、文字列と整数を相互に変換したりして、データ入力のユーザー エクスペリエンスが非常に厄介になることはお勧めできません。4000 / 5000の範囲内の整数値への文字列テキスト入力の処理などに関しては、あなた自身です。

これは、の代わりにより適した UI 要素とデータ処理 ( など) を使用することを提案した8 月以降の質問に関連しているようです。さらに、テキストの書式設定、変数の命名、ドキュメントの使用などに関する提案も行いましたが、却下されたようです。NumberboxTextField

プログラミングの最初はうまくいかないとイライラすることがありますが、これはスローダウンし、デバッグ方法を学び、問題を詳細に理解してからやり直す機会です。プログラムはおそらく、あなたがやりたいことを実行するのではなく、あなたが指示したことを実行します。そこのどこかに、先に進むための簡単な説明と解決策がなければなりません (プログラムが期待どおりに動作するまで、次の問題に進みます)。物事がうまくいく状況とは対照的に、物事がうまくいかず、それを修正すると、より多くのことを学ぶことができますが、その理由はわかりません.

于 2020-10-09T12:04:38.120 に答える