Для этого вам не нужен файл .jar. Вы можете просто создать новый файл FXML с тем, что вам нужно. поле со списком. Создайте файл класса с расширением поля со списком, контроллером и добавьте контроллер в файл FXML (в построителе сцен).
Найдите «Импорт из файла JAR / FXML» в поле со списком рядом с левым окном поиска в построителе сцен, а затем выберите файл. Теперь у вас есть новая панель заголовка в левом аккордеоне с именем Custom. Здесь вы можете найти свои компоненты.
@edit Есть файлы.
MyGridPane.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<fx:root type="javafx.scene.layout.GridPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="MyGridPane.MyGridPaneController">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
</fx:root>
MyGridPane.java
package MyGridPane;
import javafx.fxml.FXMLLoader;
import java.io.IOException;
/**
* Created by Marcin on 2014-09-01.
*/
public class MyGridPane {
MyGridPane(){
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MyGridPane.fxml"));
fxmlLoader.setRoot(this); fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
}
MyGridPaneController.java
package MyGridPane;
import javafx.fxml.Initializable;
import java.net.URL;
import java.util.ResourceBundle;
/**
* Created by Marcin on 2014-09-01.
*/
public class MyGridPaneController implements Initializable{
@Override
public void initialize(URL location, ResourceBundle resources) {
}
}
Следующий шаг добавляется в Scene Builder
[/g0]
, и вы можете добавить этот компонент .
[/g1]
Лучше выполнить левое соединение с lookup
data.frame
, содержащим сопоставления grade
- gradenumber
. Таким образом, вы избегаете многих ifelse
утверждений.
Вот воспроизводимый пример:
# Grades
grades <- paste0(rep(LETTERS[c(1:4,6)], each = 3), c("+", "", "-"))[-c(1, 13)]
grades
#[1] "A" "A-" "B+" "B" "B-" "C+" "C" "C-" "D+" "D" "D-" "F" "F-"
Generate lookup
data.frame
lookup <- data.frame(
grade = grades,
gradenumber = length(grades):1)
Теперь мы сгенерируем некоторые выборочные данные PollsFiltered
, а затем left_join
данные с lookup
по grade
.
set.seed(2018)
PollsFiltered <- data.frame(
grade = sample(grades, 20, replace = T)
)
library(dplyr)
PollsFiltered %>%
left_join(lookup, by = "grade")
# grade gradenumber
#1 B- 9
#2 C 7
#3 A 13
#4 B+ 11
#5 C 7
#6 B 10
#7 C- 6
#8 A- 12
#9 F- 1
#10 C- 6
#11 C+ 8
#12 D+ 5
#13 F- 1
#14 D+ 5
#15 D- 3
#16 D+ 5
#17 B 10
#18 C- 6
#19 D 4
#20 D- 3
Другой вариант использования dplyr
- использовать оператор case_when
следующим образом:
df$Num_grade <- NA
df <- mutate(df, Num_grade = case_when(
grades == 'A' ~ 13,
grades == 'A-' ~ 12,
grades == 'B+' ~ 11,
.
.
.
grades == 'F-' ~ 1
))
, который работает во многом как несколько операторов ifelse, но, на мой взгляд, легче понять
Вот как использовать match
(основываясь на MCVE, предложенном Морисом:
grades <- paste0(rep(LETTERS[c(1:4,6)], each = 3), c("+", "", "-"))[-c( 13)] # keep A+
PollsFiltered$nums <- match(PollsFiltered$grade, rev(grades) ) # F(1) to A+(14)
> head(PollsFiltered)
grade nums
1 B 10
2 C+ 8
3 A+ 14
4 A- 12
5 C+ 8
6 B 10