Javafx — Форма JavaFX не отображается


Изображение JavaFX не отображается на сцене

Я пробовал несколько раз и несколько способов, но я не могу сделать свое изображение на сцене, как я хочу. Я думаю, что это может иметь отношение к пути, в котором Java ищет ресурсы, но я не уверен, так как я только начинаю использовать визуальные библиотеки (JavaFX в этом случае). Здесь моя структура каталогов:

Мне нужно отформатировать myImage.jpg для отображения, и я пробовал следующее:

1) Подход Pure fxml:

2) Используя как fxml, так и java. Объявление элемента ImageView с помощью fx: и вставка изображения из StartPageController.java следующим образом:

Ни один из способов не дает никакого исключения, я просто не показываю изображение. Я понятия не имею, что делать. Я был бы очень признателен за вашу помощь.

ОБНОВЛЕНИЕ:

Первая

Я попытался отказаться от предлагаемой структуры каталогов и поместил файл изображения в ту же папку StartPageController.java . Выполняя

Я не получаю никакого исключения, но изображение не является рендерингом, что говорит мне не о поиске ресурса, а об рендеринге изображения. Может быть, отсутствие библиотеки? Я работаю в среде Windows 8, используя Netbeans 8.0. Еще раз спасибо за ваши ответы.

Второй

Я просто отключил упаковку и распространил приложение в свойствах проекта в Netbeans. Теперь изображения правильно отображаются, но я не рассматриваю проблему, потому что, когда мне нужно распространять программное обеспечение, оно появится. Пожалуйста, помощь по-прежнему нужна!:)

Почему не работает программа на javafx?

Ошибка:
Exception in Application start method
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:473)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:372)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:941)
Caused by: java.lang.RuntimeException: Exception in Application start method
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:973)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:198)
at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: javafx.fxml.LoadException: No controller specified.
/C:/Users/%d0%98%d0%b2%d0%b0%d0%bd%20%d0%94%d0%bc%d0%b8%d1%82%d1%80%d0%b8%d0%b5%d0%b2%d0%b8%d1%87/IdeaProjects/Atom%20Platform/out/production/Atom%20Platform/sample/sample.fxml:10

at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2621)
at javafx.fxml/javafx.fxml.FXMLLoader.access$100(FXMLLoader.java:105)
at javafx.fxml/javafx.fxml.FXMLLoader$Element.getControllerMethodHandle(FXMLLoader.java:565)
at javafx.fxml/javafx.fxml.FXMLLoader$Element.processEventHandlerAttributes(FXMLLoader.java:607)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:778)
at javafx.fxml/javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2838)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2557)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3253)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3210)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3179)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3152)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3129)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3122)
at sample.Main.start(Main.java:13)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:919)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(PlatformImpl.java:449)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(PlatformImpl.java:418)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:417)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175)
. 1 more
Exception running application sample.Main

Process finished with exit code 1

У меня просто кнопка не видит btn_click
Я в java новичок поэтому не знаю как её решить

Индикатор прогресса JavaFX не отображается

Привет, я пишу пользовательский диалог входа в систему. Я хочу отобразить индикатор прогресса, пока мои учетные данные пользователей будут проверены. Когда я запускаю обработчик кнопок, индикатор прогресса не появляется, хотя я вызываю метод setVisible (true). Также текст также не отображается.

1 ответ

Сделайте доступ к БД из задачи, запущенной в отдельном потоке, и обработайте результаты в обработчиках событий onSucceeded / onFailed :

Вы можете изменить параметр типа Task на Connection , хотя, возможно, вам необходимо работать с Connection позже .

JavaFX не отображается

это было домашнее задание я, что было сделано ранее. Как и в я сделал все, что мог, и повернул в том, что у меня было, и что получил нивелируется. Моя задача в том, чтобы создать графический интерфейс, который позволит вам выбрать, какой тип автомобиля вы имели (компактный, среднего размера, роскошь, вседорожник), как определено размер вашего бензобака, какой тип газа, который Вы хотели использовать (супер неэтилированный, неэтилированный, этилированный, дизельное топливо), как определено цена за галлон, и расстояние, которое вы хотели путешествовать. Затем он будет вычислить, сколько это будет стоить. У меня есть алгоритм для вычисления всех, но мой класс учил Качели, что делает мало смысла для меня, и я решил попробовать и сделать римейк это с помощью JavaFX. Моя проблема в настоящее время является то, что я не могу получить проект для компиляции, поскольку существует проблема с конструктором, и я не знаю, как получить его, чтобы он использует метод высчитывает () при нажатии на кнопку высчитывает. Im не столько беспокоит расположение программы на данный момент, потому что я не могу видеть это. Я к этому позже. Кто-нибудь может помочь мне вообще? Как я уже сказал, это был старый домашнее задание, которое уже были оценены, я просто хотел попробовать JavaFX вместо Swing.

Удалить BorderPane и все, что вещи из вашего класса ТГК как класс расширяет ButtonBase. Вам нужно переместить некоторые из этих вещей вниз в ваш метод запуска .

Создаем программу Hello World в JavaFX в IntelliJ IDEA

Пост вольный перевод статьи:

Для начала создаем проект JavaFX

Выбираем JavaFX и жмем Next

Даем имя проекту и жмем Finish.

Контроллер — это класс, предназначенный для непосредственной обработки запросов от клиента и возвращения результатов.

Чаще всего, в самом контроллере не описывается логика обработки данных. Создаются дополнительные, сервисные классы, которые выполняют все основные задачи по обработке данных. Задача методов в контроллере — вызов сервисных методов в нужном порядке и возвращение результатов клиенту.

Основная задача методов контроллера — определить требуемое действие, корректно принять данные, корректно возвратить результат. При тестировании методов клиента рекомендуется проверять не фактическую обработку данных, а корректный вызов всех команд в методе — предполагая, что алгоритм работы этих методов продуман верно.

Файл sample.fxml отвечает за интерфейс пользователя.

Переименовываем Controller в файле Controller.java

1. Наводим на имя класса-контроллера (Controller), выбираем Refractor->Rename и меняем имя класса-контроллера:

Жмем enter и завершаем рефракторинг. В файле sample.fxml должно было измениться имя класса контроллера: fx:controller=»sample.SampleController»

Важный момент, конструкция fx:id будет использоваться часто, она означает, что мы работаем с объектом класса Controller.

Создадим кнопку в интерфейсе пользователя, для этого в файл sample.fxml добавим следующие сточки:


Возможно, понадобиться руками добавить:

Как видите sayHelloWorld отмечен красным цветом, а helloWorld выделен.

Используя встроенные функции IDEA создадим поле helloWorld в файле SampleController.java

Жмем enter, завершаем рефракторинг.

Далее создаем функцию sayHelloWorld встроенными способами IDEA:

Жмем enter и завершаем рефракторинг.

Добавляем действие в функцию sayHelloWorld:

Результат работы программы:

Добавим стили в нашу программу.

В файл sample.fxml добавим следующий текст:

Встроенными методами IDEA создадим файл sample.css

Цукерберг рекомендует:  Качественное меню с выпадающими списками

В файл sample.css добавляем текст:

-fx-background-color: gold; //Цвет заднего фона окна

-fx-font-size: 20; //Высота текста Hello World

Результат работы программы:

Найдены дубликаты

Мда .. шёл 2020 год. Только сегодня попробовал JavaFX и офигел. Ну и шняга! Вот мне интересно, java ведь самый распространённый язык мира. Почему же тут так много сделано через жопу ?
Качаем jde с сайта оракл. Ставим. Прописываем переменные в path.

Качаем jdk с сайта оракл. Ставим. Прописываем переменные в path.

Качаем intellij idea с другого сайта (потому что эклипс и нетбин ещё хуже). Ставим, указываем путь к jdk.
Так, пробуем создавать форму с JavaFx (потому что swing вроде как устарел давно и всюду). Мля .. нету SceneBuilder! Качаем его с другого сайта. Ставим, указываем путь.
Обычно, кинув кнопку на форму, я ожидаю, что по двойному клику IDE _сама_ создаст событие «нажатие на кнопку» и переместит меня туда. Ха! Для java это слишком просто — будьте любезны херачить всё руками (а если у меня 30 элементов на форме ? )
Так, я хочу написать сервлет. ах, да! Совсем ведь забыл, для этого надо качать и покупать intellij idea ultimate.
Загуглим-ка учебные материалы по java. В рунете большинство курсов начинается с написания java-кода в блокноте и компиляции его в командной строке. Бл#дь, вы серьёзно ?
И да, я все эти шаги проходил, поэтому они мне знакомы. А сколько времени потратит новичок на то, чтобы во всём этом разобраться ?
Даже грёбанная 1С и то куда юзер-френдли. Вот у меня и вопрос — wtf ?

JavaFX 2. Как вывести данные в TableView?

В этом уроке мы разберемся как работать с TableView и научимся выводить POJO в TableView.

Создавать форму мы будем с помощью SceneBuilder, как его настроить можно почитать тут.

Структура нашего проекта:

Теперь пройдем по всем шагам создания данного проекта, и разберемся с деталями.

Шаг 1

Создаем простой JavaFX проект:

И редактируем класс Main.java:

Как видите в 13 строке мы указываем какой fxml файл будем использовать.

Создайте пакет views и в нем будем хранить наши views.

Шаг 2

Создаем view называем её main.fxml:

В 11-й строке мы привязываем данную view на определённый контроллер который будет управлять содержимым view.

Выглядеть будущее окно будет так:

Шаг 3

Теперь создадим POJO которое будем выводить в таблице.

На основе этого класса мы будем формировать данные для заполнения таблицы.

Шаг 4

А теперь реализуем мозг нашего приложения, а именно контроллер. Создаем новый пакет controller и в нем создаем класс Controller.java:


@FXML – эта аннотация говорит о том, что поле или метод класса доступны для разметки fxml.

Как видите мы аннотируем переменные, которые должны называться также как и id компонента разметки:

тогда в разметке fxml должно быть так:

Шаг 5

Теперь можно запустить наше приложение и посмотреть на результат:

ПОХОЖИЕ ПУБЛИКАЦИИ

23 комментариев к статье «JavaFX 2. Как вывести данные в TableView?»

Спасибо за пример! А как обновить tableView , если например ежесекундно изменяются POJO объекты ?

Ну можно следить какие поля меняются и их обновлять, либо обновлять все полностью, но это если мало данных.

Можно пример ? Видел с использованием javafx.beans.property, но там таблица сама обновляется, хотелось бы без свойств, как у вас с простыми полями int, String.
Спасибо!

Почему Вы не хотите использовать javafx.beans.property?

Здравствуйте! Спасибо Вам за очень внятную статью! Но хотелось бы кое-что уточнить….
1. Является ли в данном случае POJO – моделью?
2. Где правильней всего хранить промежуточные данные? Допустим, у Вас они хранятся в Контроллере. Но это, наверное, не совсем правильно, не так ли?
3. Какие средства следует использовать чтобы произвести чтение с XML файла в таблицу и как при этом изменится структура проекта?
Спасибо!

Если добавить поле ВСЕГО, то как там записать сумму всех Юзеров?

Если вместо Login (a = 2) цифра, Password (b=2) цифра, Email(c = a* b).Если изменяется значение ячейки, то должно меняться значение TableView. Как это реализовать?

Господа. Что-то не работает как у вас описано. В таблицу загружает, но ничего не отображает. Данные внутри точно есть, в консоль выводит.
Методо table.setVisible(true) не помог. Что может быть, не подскажете?

проверь что бы все fx:id совпадали в контролере

Почти такая проблема. Все fx:id правильно записаны, но в таблицу прописывает только первую колонку, а вторую оставляет пустой. В консоле проверял, все работает. Подскажите в чем может быть проблема, ПЛЗ

В класс, который выводим в таблицу, нужно добавить гетторов

Здравствуйте, а как таблицу Tableview заполнять из написанного мной списка ?

Добрый день.
Вы в последнем методе упомянули про импорт из базы данных.
// подготавливаем данные для таблицы
// вы можете получать их с базы данных
private void initData() <
usersData.add(new User(1, “Alex”, “qwerty”, “alex@mail.com”));
usersData.add(new User(2, “Bob”, “dsfsdfw”, “bob@mail.com”));
usersData.add(new User(3, “Jeck”, “dsfdsfwe”, “Jeck@mail.com”));
usersData.add(new User(4, “Mike”, “iueern”, “mike@mail.com”));
usersData.add(new User(5, “colin”, “woeirn”, “colin@mail.com”));
>
А можно пример?
У меня есть приложение, которое в консоль выводит результат из БД Firebird.
А вот прикрутить к JavaFX Application не выходит((

И у меня тоже не выходит и тоже firebird. Почему скачанный архив не работает – везде ошибки?

Настроила jdk – заработала

как вы это сделали? у вас есть код?

Я делаю программу, которая интерактивно создает дерево TreeView , потом я хочу перенести информацию из дерева в таблицу TableView, дополнить информацией некоторые поля строки таблицы и потом занести информацию из таблицы в записи базы данных. Везде есть интерактивное заполнение полей таблицы, а есть ли способ заносить и дополнять таблицу например из цикла for?

Что делать если возникает nullpointerexception в том месте где проиходит setCellValueFactory? Объект new PropertyValueFactory создается нормально, но далее почему то не срабатывает операций setCellValueFactory.

скажите, пожалуйста, вы решили эту проблему? и если да то как?

Я уже второй год ищу способы работы с таблицами TableView, когда изменять поля таблицы должна сама программа. Я создаю на основе редактирования дерево TreeView, а потом надо взять запись из узла дерева и занести информацию в некоторые поля таблицы. Потом взять запись таблицы и занести информацию в базу данных. Потом внести в запись таблицы поле с номером созданной записи базы данных. Потом я на основе дерева создаю запись в другой таблице, аналогичным образом заношу в базу данных и потом дополняю поле с номером созданной записи, а в запись первой таблицы вношу также этот номер второй таблицы. Вот элементарный процесс работы с таблицами, а во всех учебниках рассматривается только интерактивный механизм заполнение полей таблицы. Вы можете посоветовать, где можно найти описание работы с таблицами не используя интерактивные механизмы.
С уважением, Борис.

Цукерберг рекомендует:  Обучение - помогите подобрать удобный компилятор для C++

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

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

ez code

Просто о сложном.

Создание форм в JavaFx

Здравствуйте, уважаемые читатели Easy-Code.ru. Сегодня мы продолжим изучение платформы JavaFx и научимся создавать простые формы в JavaFx. При создании веб-приложения не обойтись без форм, например, для логина или для обратной связи, регистрации и т.д. В этом уроке мы создадим простую форму для логина и научимся базовой разметке формы, добавим элементы формы и обработаем события, происходящие при работе с ней. В этом уроке мы будем использовать среду NetBeans, перед тем как начать, убедитесь, что ваша версия поддерживает работу с JavaFX 2.

Создание проекта

Для начала нам надо создать JavaFX проект в NetBeans, назовем его Login:

  1. В меню файл выберите «Создать проект».
  2. В категории JavaFX выберите «Приложение JavaFX», нажмите «Далее»
  3. Назовите проект Login. Когда NetBeans создаст JavaFX проект, вы увидите Hello World приложение, как в предыдущем уроке.
  4. Удалите метод start(), который создал NetBeans, и замените его следующим:


Подсказка: после добавления кода в проект NetBeans, нажмите Ctrl (или Cmd) + Shift + I для импорта необходимых пакетов. После появления окна со списком, выберите тот, который начинается с javafx.

Создание сетки GridPane

Для формы логина удобно использовать GridPane, потому что этот объект позволяет создать гибкую сетку из столбцов и строк, в которые удобно поместить поля для ввода и кнопки. Вы можете поместить элементы управления в любую ячейку в сетке.

Код для создания GridPane, добавьте его перед строкой primaryStage.show():

Данный код создает объект GridPane, хранящийся в переменной grid. Свойство alignment меняет стандартное положение сетки с «вверху-слева» на центральное положение в окне. Свойства gap отвечают за пробелы между строками и столбцами, а свойство padding отвечает за пространство вокруг сетки. Порядок перечисления в insets: вверху, справа, снизу и слева. В нашем примере отступ вокруг сетки — 25 пикселей с каждой стороны.

Сцена создана с GridPane в качестве корневого узла, это обычная практика при верстке контейнеров. Таким образом при изменении размеров окна, элементы формы будут соответственно реагировать. В нашем примере форма будет оставаться по-середине при увеличении или уменьшении окна. Свойство padding гарантирует, что вокруг формы останется отступ при уменьшении размеров окна.

Данный код создает сцену шириной 300 и высотой 275. Если вы не зададите эти параметры, то сцена будет минимального размера, который необходим для отображения её содержимого.

Добавляем текст, метки и поля формы

Как видно на картинке выше, наша форма имеет заголовок «Welcome», текстовое поле и поле для ввода пароля пользователя. Рассмотрим код, создающий эти поля. Добавьте данный код после задания свойства padding GridPane:

Первая строка создает объект типа Text со значением Welcome, который нельзя изменить. Следующая строка использует метод setFont() для задания шрифта, размера и стиля переменной scenetitle. В данном примере мы используем встроенный стиль, но лучше использовать таблицы CSS, работу с ними мы рассмотрим в следующем уроке.

Метод grid.add() добавляет объект scenetitle к слою нашей формы. Нумерация столбцов и строк начинается с 0, т.о. заголовок формы будет добавлен в столбец 0 и строку 0. Последние два аргумента метода grid.add() устанавливают промежутки между столбцами — 2, между строками — 1.

Следующая строка создает объект Label с текстом User Name в столбце 0, строке 1 и Текстовое поле, которое можно редактировать. Текстовое поле добавлено в столбец 1, строку 1. Поле для ввода пароля и метка для него создаются аналогично.

При работе с GridPane можно отобразить границы, это бывает полезно при отладке. Чтобы отобразить границы разметки необходимо установить свойство gridLinesVisible равным true. Запустив после этого программу, вы увидите линии — границы столбцов и строк сетки:

Добавление кнопки и текста

Для полноценной работы форме не хватает еще два элемента: Button — кнопка, для отправки формы и Text — объект, который будет отображать информацию при нажатии на кнопку.

Сначала создадим кнопку и поместим её снизу справа — стандартное расположение кнопки в формах. Добавьте этот код перед кодом создания сцены:

Данный код создает кнопку с текстом Sign in и помещает её в вспомогательный объект HBox с отступами 10 пикселей, который служит выравнивания кнопки. Свойство alignment объекта hbBtn установлено равным Pos.BOTTOM_RIGHT, это означает, что кнопка будет выровнена по правому нижнему краю. Сам объект HBox поместим в нашу сетку в ячейку 1, 4.

Теперь добавим элемент Text, для отображения информации. Добавьте этот код до кода создания сцены:

Сейчас мы не увидим сообщения, которое должно появляться при нажатии кнопки, чтобы отобразить его, нам надо обработать событие нажатия на кнопку.

Обработка событий

Заставим кнопку показывать сообщение, когда на нее нажмут. Добавим следующий код в программу:

Метод setOnAction() используется для регистрации обработчика события нажатия на кнопку. Когда происходит нажатие на кнопку мы меняем цвет текста сообщения на красный:

Обработка событий JavaFX

Теперь запустите приложение, нажмите на кнопку и увидите результат. На этом всё, не пропустите новые уроки!

JavaFx Stage не отображается

Я пытаюсь заставить сцену появиться, но ничего не загружается. Компиляция не выявляет ошибок, но ничего не загружается. Любая помощь приветствуется! Спасибо! :) Важной частью этого является то, что при запуске был JavaFX, ничего не загружалось. Совсем. Я действительно не понимаю, что не так с этой программой.

1 ответ

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

Это код, который испортил программу. По какой-то причине загрузка сразу двух сцен испортила дисплей.

Вопрос по c++, visual-c++-2005, variant &#8211 Функция, которая возвращает неизвестный тип

Теперь, используя знание о том, что a = 1 подразумевает, что мне нужно вернуть целое число и т. Д., Существует ли в любом случае Doit () может вернуть переменную переменной типа данных?

По сути, чем я могу заменитьЧТО-ТО ?

PS: яЯ пытаюсь найти альтернативу возвращению структуры / объединения, содержащего эти типы данных.

Если пользователь знает, что вставлено, вы можете использовать шаблон, чтобы это исправить. Если нет, я могуне думаю о каком-либо решении.

Вы должны привести приведенное значение, поэтому вы должны знать, что возвращается.

Обычный способ достичь чего-то вроде этого — это C, который неt всегда работает в C ++, с объединением и полем типа:

Это нене работает в C ++, когда одним из возможных типов значений является класс с нетривиальным конструктором, потому что он не будетВсегда понятно, какой конструктор должен быть вызван.Boost.Variant использует более сложную версию этого подхода, чтобы обеспечить такую конструкцию для любых типов значений в C ++.

Цукерберг рекомендует:  Навигация с эффектом скольжения при смене категорий

Adobe Source Libraries также имеет adobe::any_regular_t , который позволяет хранить любой тип, пока он моделируетрегулярное концепция. Вы бы обернули ваше возвращаемое значение так же, как с boost::any , (На связанной странице также есть документация о том, как adobe::any_regular_t отличается от boost::any — Конечно, тип, который вы выбираете, должен зависеть от требований вашего кода.)


Я думаю, что проблема заключается в этой функции дизайна. Вы пробовали перегрузку?

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

Вы можете использовать союз:

Вместо этого вы могли бы перейти по ссылке и сохранить тип и проверить, работает ли он одновременно, и не потребует никакой дополнительной библиотеки (ваш тип решения ANSI C ++):

Я нахожу это решение часто более чистым с точки зрения дизайна. Это’Прискорбно, что подписи под функционалом неДопускается использование нескольких типов в качестве возвращаемых типов, но таким образом вы можете передавать все что угодно.

Вы можете использовать структуру, содержащую void* указывая на значение, которое вы хотите вернуть вместе с size_t это указывает на размер возвращаемого объекта. Что-то вроде этого:

Помните, что void* должен указывать на значение, находящееся в куче (то есть динамически распределяется с использованием new или же malloc ) и вызывающая сторона должна позаботиться об освобождении выделенного объекта.

Сказав это, я думаю, что этоплохая идея в целом.

Редактировать: Вы также можете рассмотреть возможность включения флага, указывающего, что было возвращено в вышеупомянутой структуре, чтобы вызывающий мог понять это, если вызывающий не знает, какой тип ожидать.

Ты можешь использовать boost::any или же boost::variant делать то, что вы хотите. рекомендую boost::variant потому что вы знаете коллекцию типов, которые вы хотите вернуть.

Это очень простой пример, хотя вы можете сделать гораздо больше с variant , Проверьте ссылку для большего количества примеров :)

я хотел бы использовать boost::variant вместо union потому что ты можешь’использовать не-POD типы внутри union , Также, boost::any здорово, если ты нене знаю тип, с которым вы имеете дело. В противном случае я бы использовал boost::variant потому что это гораздо эффективнее и безопаснее.

Отвечая на отредактированный вопрос: Если вы нене хочу грузить Boost с вашим кодом, посмотрите на bcp , Описание bcp по той же ссылке:

Утилита bcp — это инструмент для извлечения подмножеств Boost, это ‘Это полезно для авторов Boost, которые хотят распространять свою библиотеку отдельно от Boost, и для пользователей Boost, которые хотят распространять подмножество Boost вместе со своим приложением.

bcp также может сообщать о том, от каких частей Boost зависит ваш код и какие лицензии используются этими зависимостями.

Если вы знаете тип во время компиляции, вы можете использовать шаблоны. Если тип зависит от времени выполнения, то использование шаблонов не вариант.

C ++ является языком со строгой типизацией и не имеет понятия неизвестного типа. Вы можете попробовать использовать boost :: any, который может (вроде) указывать любой тип. Я бы поставил под сомнение дизайн вашей функции, однако.

РЕДАКТИРОВАТЬ: boost :: any с использованием bcp (спасибо AraK) кажется лучшим решением на сегодняшний день, но возможно ли доказать (до некоторой степени), что не существует ANSI C ++ решения этой проблемы?

Вы, кажется, немного запутались в терминологии здесь.

Во-первых, давайтеНазовем это ISO C ++, не так ли? Он был стандартизирован ISO в 1998 году, и с тех пор именно на это ссылались люди, когда говорили «стандарт С ++ », Теперь, что вы подразумеваете под «ANSI C ++ решение «?

  • Решение, которое аккуратно компилируется с использованием только ANSI (или ISO) C ++? Если это так, Boostявляется решение ANSI C ++
  • Решениеуже реализовано в стандартной библиотеке ANSI C ++? Если так, то нет, такого решения не существует (и нет «доказательство», Кроме как «прочитайте языковой стандарт и посмотрите, сможете ли вы найти такой класс. Если ты можешь’т, это нет там «.
  • Решение, которое вы могли бы реализоватьсам используя только ANSI C ++. Тогда ответ «да, вы можете скопировать исходный код из Boost «.

Я могу’не представляю, что это за «доказательство» вы’буду искать. C ++ — это документ в прозе. Это не математическое уравнение. Не может быть «доказано»кроме как «иди почитай стандарт, Доказать что-тоявляется Определить на языке или в стандартной библиотеке легко — просто укажите, где в стандарте это описано. Но доказывая, что-тоне там в принципе невозможно — кроме перечислениякаждый одно предложение стандарта и документ, который ни один из них не описывает то, что выищу. И я сомневаюсь в тебенайду любого, кто захочет сделатьтот для тебя.

Во всяком случае, правильное стандартное решение C ++является использовать Boost. Это не тяжелое решение. Boost довольно легкий в том, что вы можете включитьименно так биты, которые вам нужны, без каких-либо зависимостей от остальной части коллекции библиотеки.

Из того, что выКак мы уже говорили (легкое приложение для широкой пользовательской базы), нет никаких причин не использовать Boost. Это может упростить ваш код и уменьшить количество ошибок, вызванных попытками изобретать велосипед. При распространении скомпилированного исполняемого файла он имеет нулевую стоимость. Boost.Any библиотека, как и большая часть Boost, предназначена только для заголовков и просто компилируется в ваш исполняемый файл. Отдельные библиотеки не должны распространяться.

Ничего нельзя получить, пытаясь изобрести колесо. Ваш исполняемый файл будет не меньше и не эффективнее, нобудут быть более глючным.

И я’Я готов поспорить, что ваше домашнее решение будетне быть ANSI C ++. Он будет опираться на некоторую форму неопределенного поведения. Если вам нужно решение ANSI-C ++, лучшим выбором будет Boost.

java — Изображение Javafx не отображается должным образом

Я пытался отобразить анимированный gif из старой игры Age Of Empires. и gif делает странно черным, а не прозрачным. gif — это любой gif из http://ageofempiresgif.altervista.org/en/archive.php

    2 1
  • 26 мар 2020 2020-03-26 21:35:41
  • coolsidd

1 ответ

Я могу реплицировать неправильный рендеринг gifs Age of Empires на моей машине (Java8b111, Win7, ATI Radeon HD 4600).

Проблема отслеживается в JavaFX Issue Tracker

Проблема заключается в том, что кадры GIF RT-23233 имеют неправильный фон (требуется регистрация, но кто-то может зарегистрироваться и по предоставленной ссылке и просмотреть подробные сведения о проблеме). Эта проблема запланирована для реализации в выпуске после выпуска Java 8.

Причина в том, что JavaFX строго придерживается спецификации gif, тогда как большая реализация gif-рендеринга (например, все распространенные браузеры) более разрешительна и, таким образом, визуализирует изображение по-разному («правильно»). Связанный RT-23233 представляет собой запрос на ослабление реализации gif-рендеринга JavaFX, чтобы он отображал gifs, например, gifs Age of Empires.

Пример программы, которая реплицирует проблему только с помощью ImageView

Пример программы, которая реплицирует проблему только с помощью WebView

Пример страницы, созданной в JavaFX WebView

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих