Ответы пользователя по тегу JavaFX
  • Как правильно собрать exe что бы приложение могло взаимодействовать с файлами .xml и .properties?

    @zelan
    Кратко обо мне не получится.
    Проверь работает ли нормально jar. Если да, то после try добавь catch с выводом стектрейса в консоль.
    Собирай exe. Запускай программу в терминале: java -jar <*.exe> (должно отрабатывать, по крайней мере с launch4j работает). Или просто запусти в терминале.

    Стек трейс с ошибкой должен быть выведен в консоль.
    Ответ написан
    Комментировать
  • Как сделать, чтобы колонка была по всё ширине?

    @zelan
    Кратко обо мне не получится.
    Одна колонка будет растягиваться на всю ширину.
    TableView table = new TableView<Object>();
    table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
    
    TableColumn column = new TableColumn("asda");
    table.getColumns().add(column);


    Если добавите еще колонок, то по умолчанию они будут делить доступную ширину между собой. Количество занимаемой ширины зависит от значения максимальной ширины колонки. Если первая колонка на максимуме занимает 3000px, а вторая 6000px, то первая будет занимать 1/3, а вторая 2/3.

    В целом лучше поставь SceneBuilder и экспериментируй там. Все возможные настройки там есть, нагляднее будет.
    Ответ написан
    3 комментария
  • Как подключить JavaFX к проекту на Maven?

    @zelan
    Кратко обо мне не получится.
    Oleg Genevjov: попробую побыть ясновидящим (сквозь пространство и нежелание показать хотя бы кусок кода где грузится fxml)

    Практически уверен что до подключения ссылка (адрес в виде стринга) на fxml была
    FXMLLoader loader = new FXMLLoader(getClass().getResource("com/blablabla/Some.fxml"));


    Если да, то после подключения maven нужно поправить адрес *.fxml, а именно добавить слэш в начало:

    FXMLLoader loader = new FXMLLoader(getClass().getResource("/com/blablabla/Some.fxml"));
    Ответ написан
    1 комментарий
  • Почему у меня строки равны null?

    @zelan
    Кратко обо мне не получится.
    если вылетает здесь:
    if (contact == null){
             lblName.setText(contact.getName());
             lblSense.setText(contact.getSense());
     }


    то lblName или lblSense, а может быть и оба - не инициализированы и раны null.

    Почему? Надо больше кода.
    Прикол в том, что эта проверка бессмысленна, если бы контакт был бы равен null, то ты бы обработал этот вариант тут:

    if ( empty||contact == null){
                setText(null);
                setGraphic(null);
    }

    А если ты дошел сюда, то контакт ТОЧНО не равен null.
    Ответ написан
  • Как добавить кнопку кодом в javaFX?

    @zelan
    Кратко обо мне не получится.
    Попробуй так:

    Pane root = (Pane) FXMLLoader.load(getClass().getResource("sample.fxml"));
    Ответ написан
    1 комментарий
  • Как разбить ListView на ячейки?

    @zelan
    Кратко обо мне не получится.
    Можно вот так:

    public class Main extends Application {
        
        @Override
        public void start(Stage primaryStage) throws Exception{
            Pane root = new Pane();
            primaryStage.setTitle("Hello World");
            primaryStage.setScene(new Scene(root, 300, 275));
            primaryStage.show();
    
    
            //подготавливаем список для листа
            ObservableList<TestEntity> list = FXCollections.<TestEntity>observableArrayList();
            
            list.addAll(
                    new TestEntity(new Button("button1"), "str1"),
                    new TestEntity(new Button("button2"), "str2"),
                    new TestEntity(new Button("button3"), "str3"));
    
    
            ListView<TestEntity> listView = new ListView<TestEntity>(list);
    
            //устанавливаем фабрику для отрисовки ячейки.
            listView.setCellFactory(new Callback<ListView<TestEntity>, ListCell<TestEntity>>() {
                @Override
                public ListCell<TestEntity> call(ListView<TestEntity> param) {
    
                    //тут нужно собрать объект ListCell, и вернуть его
                    ListCell<TestEntity> listCell = new ListCell<TestEntity>(){
    
                        //отрисовка происходит здеся
                        @Override
                        protected void updateItem(TestEntity item, boolean empty) {
    
    
                            super.updateItem(item, empty);
    
                            if (empty || item == null) {
                                setText(null);
                                setGraphic(null);
                            } else {
    
                                //тут конструируешь все что захочешь
                                //или можешь подгружать fxml
                                HBox hBox = new HBox();
    
    
                                Label label = new Label(item.getString());
                                hBox.getChildren().addAll(item.getButton(), label);
    
                                //устанавливаем графику
                                setGraphic(hBox);
    
                            }
                        }
                    };
    
                    return listCell;
    
    
    
                }
            });
    
            root.getChildren().add(listView);
    
        }
    
        class TestEntity{
            Button button;
            String string;
            TestEntity(Button button, String str){
                setButton(button);
                setString(str);
            }
    
            public Button getButton() {
                return button;
            }
    
            public void setButton(Button button) {
                this.button = button;
            }
    
            public String getString() {
                return string;
            }
    
            public void setString(String string) {
                this.string = string;
            }
        }
    
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    Ответ написан
    1 комментарий
  • Можно ли менять контейнеры (слои)при нажатие кнопки, работа в JavaFX?

    @zelan
    Кратко обо мне не получится.
    можно.

    Если кнопка обычная, то вот основа.

    import javafx.application.Application;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.SplitPane;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    
    /**
     * Created by Evgeny on 18.03.2016.
     */
    public class Example extends Application {
    
    
        @Override
        public void start(Stage primaryStage) throws Exception {
    
    
            BorderPane borderPane = new BorderPane();
            SplitPane splitPane1 = new SplitPane();
            Button button_changeContainer = new Button("Изменить контейнер");
            splitPane1.getItems().add(button_changeContainer);
            SplitPane splitPane2 = new SplitPane();
            splitPane2.getItems().addAll(new Label("Первый"),new Label("Контейнер"), new Label("SplitPane"));
    
            VBox vBox = new VBox();
            vBox.getChildren().addAll(new Label("Второй"),new Label("Контейнер"), new Label("VBox"));
    
    
            borderPane.setCenter(splitPane1);
            borderPane.setRight(splitPane2);
    
    
            button_changeContainer.setOnAction(new EventHandler<ActionEvent>() {
                boolean firstOrSecond = true;
                @Override
                public void handle(ActionEvent event) {
                    firstOrSecond = !firstOrSecond;
    
                    if(firstOrSecond){
                        borderPane.setRight(splitPane2);
    
                    }
                    else borderPane.setRight(vBox);
                }
            });
    
    
    
    
            primaryStage.setScene(new Scene(borderPane));
            primaryStage.setWidth(600);
            primaryStage.setHeight(600);
    
            primaryStage.show();
    
        }
    }
    Ответ написан
    3 комментария
  • Как подключить в JavaFx библиотеку jquery?

    @zelan
    Кратко обо мне не получится.
    в общем так, если html файл лежит в jar'е, то для установки внешних стилей и скриптов нужно указывать полный абсолютный путь к файлам.

    Лучше сделать так: грузить в webview файл не из jar, в этом случае все будет работать так, как и должно. Т.е. пути до скриптов и стилей можно указать относительные (относительно index.html).

    <link rel="stylesheet" type="text/css" href="style.css">


    вместо строки

    webEngine.load(FXMLController.class.getResource("/html/index.html").toExternalForm());


    добавь

    try {
          webEngine.load(new File("html/index.html").toURI().toURL().toExternalForm());
    } catch (IOException e) {
          e.printStackTrace();
    }

    и ВЫНЕСИ папку html c содержимым из ресурсов на тот же уровень где лежат папки src, .idea.

    При запуске jar (после сборки) рядом должна лежать (либо вручную кидай, либо мавеном) папка html с содержимым. В этом случае все будет грузиться и работать.

    Есть еще вариант, написать скрипт, который при сборке приложения собирает все стили и скрипты и пишет их содержимое внутрь index.html, наверняка такое в мире веба уже кто-то делал. Тогда твой вариант программы будет работать, так как все будет находиться в одном файле и подгрузка будет не нужна.
    Ответ написан