Können Sie die klickbare Region um ein Etikett in Javafx ändern?Java

Java-Forum
Anonymous
 Können Sie die klickbare Region um ein Etikett in Javafx ändern?

Post by Anonymous »

In Javafx (Version 21) gibt es CSS -Eigenschaften, um die Ränder um Etiketten zu ändern. Dies wird normalerweise verwendet, um den Raum zwischen dem Text im Etikett und seinem Rand zu erhöhen. Abstand zwischen dem Text und dem Rand schrumpft. Es ist nicht sehr offensichtlich, warum dies nützlich wäre, wenn Sie mit einer gut erzogenen Schrift arbeiten, aber es gibt einige Schriftarten, die standardmäßig wirklich bizarre Margen erzeugen. Das schlimmste Beispiel, das ich gefunden habe, ist die Schriftart "Harlow Solid Italic", die hier mit übertriebenen Farben auf einem schwarzen Hintergrund demonstriert wurde: < /p>

Code: Select all

.test-label {
-fx-background-color: blue;
-fx-border-color: red;
-fx-font-family: "Harlow Solid Italic";
-fx-font-size: 100;
}
< /code>

Es ist ziemlich einfach, das Problem hier zu sehen. Dies kann durch Verwendung der Eigenschaft -fx -Padding 
angepasst werden wie SO:
< /p>

Code: Select all

.test-label {
-fx-background-color: blue;
-fx-border-color: red;
-fx-font-family: "Harlow Solid Italic";
-fx-font-size: 100;
-fx-padding: -40 20 0 20;
}
< /code>

Die Augen sind viel einfacher. Als ob es hier kein Problem gäbe - das Problem ist gelöst. Dies ist jedoch nicht der Fall. Während visuell alles in Ordnung zu sein scheint, ist die Registrierung von Mausereignissen leider nicht. Erwägen Sie beispielsweise das Etikett auf die folgende Weise zu machen (vergib mir für alle leichten Fehler hier, ich schneide einen Großteil des Fetts von Manager -Klassen aus, um ein minimal reproduzierbares Beispiel zu machen): 
public class MyApp extends Application {
@Override
public void start(Stage stage) {
root = new Pane();

root.setStyle("-fx-background-color: black;");
root.getChildren().add(createTestLabel());
scene = new Scene(root);

scene.getStylesheets().add("/ExampleStylesheet.css");
stage.setScene(scene);
// stage.setMaximized(true); I do this for convenience
stage.show();
}

public static void main(String[] args) {
launch(args);
}

public Label createTestLabel() {
Label testLabel = new Label("Placeholder\nText");

//testLabel.setLayoutX(xPos); for your convenience should you
//testLabel.setLayoutY(yPos); want to test this yourself
testLabel.getStyleClass().add("test-label");
testLabel.setTextAlignment(TextAlignment.CENTER);
//testLabel.setPickOnBounds(false); I include this because it does not make a difference for the issue I'm getting at.
testLabel.setOnMouseEntered(event -> doSomething());
testLabel.setOnMouseExited(event -> doSomethingElse());

return testLabel;
}

public void doSomething() {
//System.out.println("Inside label."); for example
}

public void doSomethingElse() {
//System.out.println("Outside label."); for example
}
}
Wenn Sie das oben genannte tun, sind das Ergebnis die Screenshots von früher, aber mit einem kleinen Problem - Ihr Dosenthing () und doSomethingelse () wird Passieren Sie, wenn die Maus über leicht über der Grenze des Etiketts ist, wo der Rand ohne die Polsterung gewesen wäre. Visuell sieht das so aus:


Der grüne Bereich ist der Bereich, der vom Etikett von der Padding -Eigenschaft abgeschnitten wurde. Obwohl es weg ist, zählt es für Mausereignisse als im Etikett. Etikett. Das möchte ich ändern, denn wenn Sie etwas komplizierteres tun würden Das Etikett ohne es sieht so aus, als ob sich die Maus innerhalb des Randes des Etiketts befindet. Es gilt nicht für Bereiche, die dem Etikett hinzugefügt wurden. In diesem Sinne ist der Bereich links und rechts des Etiketts anklickbar, was Sinn macht und wünschenswert ist. -Padding mit -FX-BORDER-INSETS und -FX-Background-Insets sowie die PickOnbounds -Eigenschaft für das Etikett (wie im Kommentar in dem Kommentar in angezeigt Der Beispielcode oben). Keines von beiden hilft bei der Lösung dieses Problems. Ich kann mir nicht vorstellen, dass dieses Verhalten beabsichtigt ist. Deshalb möchte ich in der Lage sein, die "klickbare Region" des Etiketts als Mittel um das Problem zu manipulieren, daher die Frage - kann ich das tun und wenn ja, wie? < /P>
(Hinweis: Dies ist ein Repost einer alten Frage, die ich im Dezember veröffentlicht habe. Es war zu verwirrend und nicht detailliert genug, um das Problem richtig zu vermitteln. Deshalb habe ich diese Frage seitdem gelöscht, da dies mein zweiter, überarbeiteter Versuch ist die Verwirrungspunkte, die andere mit der ursprünglichen Frage hatten.)

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post