Изменение размеров изображений в соответствии с родительским node
Как мне получить изображение в ImageView для автоматического изменения размера, чтобы оно всегда соответствовало родительскому node?
Вот пример небольшого кода:
@Override
public void start(Stage stage) throws Exception {
BorderPane pane = new BorderPane();
ImageView img = new ImageView("http://...");
//didn't work for me:
//img.fitWidthProperty().bind(new SimpleDoubleProperty(stage.getWidth()));
pane.setCenter(img);
Scene scene = new Scene(pane);
stage.setScene(scene);
stage.show();
}
Ответы
Ответ 1
@Override
public void start(Stage stage) throws Exception {
BorderPane pane = new BorderPane();
ImageView img = new ImageView("http://...");
img.fitWidthProperty().bind(stage.widthProperty());
pane.setCenter(img);
Scene scene = new Scene(pane);
stage.setScene(scene);
stage.show();
}
Ответ 2
Это лучшее решение, чем привязка свойства width (лучше, потому что часто при привязке дочернего элемента к контейнеру может быть невозможно сделать контейнер меньшим. В других случаях контейнер может даже автоматически начать расти).
В приведенном ниже решении полагается переопределить ImageView, чтобы мы могли вести себя как "изменяемый размер", а затем предоставляли реализации для минимальной, предпочтительной и максимальной ширины/высоты. Также важно реализовать вызов resize().
class WrappedImageView extends ImageView
{
WrappedImageView()
{
setPreserveRatio(false);
}
@Override
public double minWidth(double height)
{
return 40;
}
@Override
public double prefWidth(double height)
{
Image I=getImage();
if (I==null) return minWidth(height);
return I.getWidth();
}
@Override
public double maxWidth(double height)
{
return 16384;
}
@Override
public double minHeight(double width)
{
return 40;
}
@Override
public double prefHeight(double width)
{
Image I=getImage();
if (I==null) return minHeight(width);
return I.getHeight();
}
@Override
public double maxHeight(double width)
{
return 16384;
}
@Override
public boolean isResizable()
{
return true;
}
@Override
public void resize(double width, double height)
{
setFitWidth(width);
setFitHeight(height);
}
}
Ответ 3
Используйте ScrollPane или просто панель для решения этой проблемы:
Пример:
img_view1.fitWidthProperty().bind(scrollpane_imageview1.widthProperty());
img_view1.fitHeightProperty().bind(scrollpane_imageview1.heightProperty());
Ответ 4
Если вы хотите, чтобы ImageView располагался внутри рамки Windows, используйте эту строку кода: imageView.fitWidthProperty(). Bind (scene.widthProperty()).
Обратите внимание, что я использую widthProperty сцены, а не сцену.
Пример:
import java.io.FileNotFoundException;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
public class MapViewer extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage primaryStage) throws FileNotFoundException {
String strTitle = "Titulo de la Ventana";
int w_width = 800;
int w_height = 412;
primaryStage.setTitle(strTitle);
primaryStage.setWidth(w_width);
primaryStage.setHeight(w_height);
Group root = new Group();
Scene scene = new Scene(root);
final ImageView imv = new ImageView("file:C:/Users/utp/Documents/1.2008.png");
imv.fitWidthProperty().bind(scene.widthProperty());
imv.setPreserveRatio(true);
root.getChildren().add(imv);
primaryStage.setScene(scene);
primaryStage.show();
}
}
Аспектная радиостанция сцены (primaryStage) должна быть такой же, как у изображения (1.2008.png)
Ответ 5
Это метод вычисляемой ширины, который удаляет ширину полосы прокрутки.
первый:
myImageView.setPreserveRatio(true);
Изменение ширины полосы прокрутки монитора:
scrollPane.widthProperty().addListener((observable, oldValue, newValue) -> {
myImageView.setFitWidth(newValue.doubleValue() - (oldValue.doubleValue() - scrollPane.getViewportBounds().getWidth()));
});
ширина прокрутки: ширина:
oldValue.doubleValue() - scrollPane.getViewportBounds().getWidth()
Как установить ширину инициализации?
после primaryStage.show();
myImageView.setFitWidth(scrollPane.getViewportBounds().getWidth());