Как сделать кнопку изображения в JavaFX без какого-либо стиля (только изображение)? [Дубликат]

Sine Python 3.5 вы можете использовать функцию math.isclose(), если условия

import math

if math.isclose(0.1 + 0.2, 0.3, abs_tol=0.01):
    pass
18
задан imgx64 14 March 2016 в 11:37
поделиться

3 ответа

Есть несколько способов сделать это, я расскажу о своих избранных.

Используйте ToggleButton и применяйте к нему собственный стиль. Я предлагаю это, потому что ваш требуемый элемент управления «как кнопка переключения», но выглядит просто отличным от стиля кнопки переключения по умолчанию.

. Мой предпочтительный метод заключается в определении графика кнопки в css:

.toggle-button {
  -fx-graphic: url('http://icons.iconarchive.com/icons/aha-soft/desktop-buffet/128/Pizza-icon.png');
}

.toggle-button:selected {
  -fx-graphic: url('http://icons.iconarchive.com/icons/aha-soft/desktop-buffet/128/Piece-of-cake-icon.png');
}

ИЛИ используйте прилагаемый css для определения фонового изображения.

// file imagetogglebutton.css deployed in the same package as ToggleButtonImage.class
.toggle-button {
  -fx-background-image: url('http://icons.iconarchive.com/icons/aha-soft/desktop-buffet/128/Pizza-icon.png');
  -fx-background-repeat: no-repeat;
  -fx-background-position: center;
}

.toggle-button:selected {
  -fx-background-image: url('http://icons.iconarchive.com/icons/aha-soft/desktop-buffet/128/Piece-of-cake-icon.png');
}

Я предпочитаю спецификацию -fx-graphics по спецификациям -fx-background- * в качестве правил для стиля фона изображения сложны, и настройка фона не позволяет автоматически размер кнопки для изображения, тогда как установка рисунка делает.

И некоторый пример кода:

import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.StackPaneBuilder;
import javafx.stage.Stage;

public class ToggleButtonImage extends Application {
  public static void main(String[] args) throws Exception { launch(args); }
  @Override public void start(final Stage stage) throws Exception {
    final ToggleButton toggle = new ToggleButton();
    toggle.getStylesheets().add(this.getClass().getResource(
      "imagetogglebutton.css"
    ).toExternalForm());
    toggle.setMinSize(148, 148); toggle.setMaxSize(148, 148);
    stage.setScene(new Scene(
      StackPaneBuilder.create()
        .children(toggle)
        .style("-fx-padding:10; -fx-background-color: cornsilk;")
        .build()
    ));
    stage.show();
  }
}

Некоторые преимущества этого :

  1. Вы получаете поведение кнопки переключения по умолчанию и не должны повторно выполнять его самостоятельно, добавляя свой собственный стиль фокусировки, мышь и обработчики ключей и т. д.
  2. Если ваше приложение будет перенесено на другую платформу, например мобильное устройство, оно будет работать вне коробки, реагируя на события касания, а не на события мыши и т. Д.
  3. Ваш стиль отделен от вашего ap

Альтернативный вариант - не использовать css и использовать ToggleButton, но установить графику изображения в коде:

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.scene.*;
import javafx.scene.control.ToggleButton;
import javafx.scene.image.*;
import javafx.scene.layout.StackPaneBuilder;
import javafx.stage.Stage;

public class ToggleButtonImageViaGraphic extends Application {
  public static void main(String[] args) throws Exception { launch(args); }
  @Override public void start(final Stage stage) throws Exception {
    final ToggleButton toggle      = new ToggleButton();
    final Image        unselected  = new Image(
      "http://icons.iconarchive.com/icons/aha-soft/desktop-buffet/128/Pizza-icon.png"
    );
    final Image        selected    = new Image(
      "http://icons.iconarchive.com/icons/aha-soft/desktop-buffet/128/Piece-of-cake-icon.png"
    );
    final ImageView    toggleImage = new ImageView();
    toggle.setGraphic(toggleImage);
    toggleImage.imageProperty().bind(Bindings
      .when(toggle.selectedProperty())
        .then(selected)
        .otherwise(unselected)
    );

    stage.setScene(new Scene(
      StackPaneBuilder.create()
        .children(toggle)
        .style("-fx-padding:10; -fx-background-color: cornsilk;")
        .build()
    ));
    stage.show();
  }
}

Основанный на кодах подход имеет то преимущество, что вам не нужно использовать css, если вы несовместимы с ним.

Для лучшей производительности и удобства переноса на беззнаковые апплеты и в виде песочницы webstart свяжите изображения с вашим приложением и ссылаться на них по относительным URL-адресам пути, а не загружать их из сети.

45
ответ дан jewelsea 26 August 2018 в 20:19
поделиться

Вам просто нужно создать свой собственный класс, унаследованный от родителя. Поместите ImageView на это, а на событиях в мыши и мыши просто измените изображения ImageView.

public class ImageButton extends Parent {

    private static final Image NORMAL_IMAGE = ...;
    private static final Image PRESSED_IMAGE = ...;

    private final ImageView iv;

    public ImageButton() {
        this.iv = new ImageView(NORMAL_IMAGE);
        this.getChildren().add(this.iv);

        this.iv.setOnMousePressed(new EventHandler<MouseEvent>() {

            public void handle(MouseEvent evt) {
                iv.setImage(PRESSED_IMAGE);
            }

        });

        // TODO other event handlers like mouse up

    } 

}
6
ответ дан dipacs 26 August 2018 в 20:19
поделиться

Комбинация предыдущих двух ответов сделала трюк. Благодарю. Новый класс, который наследуется от Button. Примечание: updateImages () следует вызвать перед показом кнопки.

import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;

public class ImageButton extends Button {

    public void updateImages(final Image selected, final Image unselected) {
        final ImageView iv = new ImageView(selected);
        this.getChildren().add(iv);

        iv.setOnMousePressed(new EventHandler<MouseEvent>() {
            public void handle(MouseEvent evt) {
                iv.setImage(unselected);
            }
        });
        iv.setOnMouseReleased(new EventHandler<MouseEvent>() {
            public void handle(MouseEvent evt) {
                iv.setImage(selected);
            }
        });

        super.setGraphic(iv);
    }
}
3
ответ дан karnbo 26 August 2018 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: