当我打开FXML文件时,我有一个Class not found异常。 我已经导入了我的课程
我的FXML文件:
<?xml version="1.0" encoding="UTF-8"?>
<?import org.m2l.application.MultiSelectTableView?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TableColumn?>
<fx:root type="javafx.scene.layout.VBox" xmlns:fx="http://javafx.com/fxml">
<MultiSelectTableView fx:id="tbvPublic" prefHeight="200.0" prefWidth="591.0" tableMenuButtonVisible="true" >
<columns>
<TableColumn fx:id="columnIdPublic" prefWidth="86.0" text="IDPublic" />
<TableColumn fx:id="columnLibellePublic" prefWidth="484.0" text="LibelléPublic" />
</columns>
</MultiSelectTableView>
</fx:root>
这是我的MultiSelectTableView类,它使用泛型扩展了TableView:
package org.m2l.application;
import java.util.HashSet;
import java.util.function.Consumer;
import javafx.application.Platform;
import javafx.beans.DefaultProperty;
import javafx.collections.ObservableList;
import javafx.scene.control.Selectionmode;
import javafx.scene.control.TableView;
//Source: https://gist.github.com/SalomonBrys/8039ecdbbfc0fa465c60e948d0abe8da
/**
* TableView that allows multi-selection by default (without holding the control
* key)
*
* @see TableView
* @param <S> The type of the objects contained within the TableView items list.
*/
@DefaultProperty("items")
public class MultiSelectTableView<S> extends TableView<S> {
private boolean _update = false;
private HashSet<Integer> _selectedIndices = new HashSet<>();
private int _lastSelectedIndex = -1;
private int _previousSelectedIndex = -1;
/**
* @see TableView#TableView()
*/
public MultiSelectTableView() {
super();
_init();
}
/**
* @see TableView#TableView(ObservableList)
*/
public MultiSelectTableView(ObservableList<S> items) {
super(items);
_init();
}
private void _init() {
...
}
private void _toggle(Integer index) {
if (!_selectedIndices.remove(index))
_selectedIndices.add(index);
}
private void _makeSelection() {
getSelectionmodel().clearSelection();
_selectedIndices.forEach(index -> getSelectionmodel().select(index));
}
/**
* You should always use this method when planning to update the selection.
*
* For example: <code>tableView.updateSelection(sm -> sm.clearAll());</code>
*
* @param c A function that will mutate the selection.
*/
public void updateSelection(Consumer<TableViewSelectionmodel<S>> c) {
_update = true;
TableViewSelectionmodel<S> sm = getSelectionmodel();
c.accept(sm);
Platform.runLater(() -> {
sm.select(null);
_selectedIndices.clear();
_selectedIndices.addAll(sm.getSelectedIndices());
_update = false;
});
}
}
这是我的控制器,看来是正确的:
package org.m2l.controleurs;
...
import org.m2l.application.MultiSelectTableView;
import org.m2l.modeles.Public;
...
public class TbvPublicControleur extends VBox implements Initializable {
@FXML
private MultiSelectTableView<Public> tbvPublic;
@FXML
private TableColumn<Public,Integer> columnIdPublic;
@FXML
private TableColumn<Public,String> columnLibellePublic;
@FXML
private TextField textField;
public TbvPublicControleur() {
try {
FXMLLoader loader = new FXMLLoader(getclass().getResource("/org/m2L/vues/TbvPublic.fxml"));
loader.setClassLoader(getclass().getclassLoader());
loader.setRoot(this);
loader.setController(this);
loader.load();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void initialize(URL location,ResourceBundle resources) {
System.out.println("URL location: " + location);
System.out.println("ResourceBundle resources: " + resources);
ObservableList<Public> lesPublics = FXCollections.observableArrayList();
lesPublics.setall(new Public(1,"Bénévole"),new Public(2,"Enseignant"));
columnIdPublic.setCellValueFactory(new PropertyValueFactory<Public,Integer>("IdPublic"));
columnLibellePublic.setCellValueFactory(new PropertyValueFactory<Public,String>("LibellePublic"));
tbvPublic.setItems(lesPublics);
}
}
可能是,我必须先在Scenebuilder中添加一个jar,但是没有教程... 谢谢您的帮助...
[编辑],我的解决方案:
在eclipse中: MultiSelectTableView.java文件上的上下文菜单,选择导出,Jar File,下一步,
在Jar文件规范中 检查.classpath,检查.project,检查导出生成的类文件和资源,检查导出Java源文件和资源,
在选项中: 压缩jar文件的内容 添加目录条目
下一步:在罐子里包装选项 取消选中带有编译错误的导出类文件
取消选中带有编译警告的导出类文件
(并取消选中在工作空间中保存此JAR的描述)
下一步,在Jar清单规范中 仅检查生成清单文件(不将清单保存在工作空间中) 检查一些包装的封条,没有封条
在文本字段“主类”中留空
单击完成,仅此而已。...
在fxml文件中,注释引发异常的原始导入(在我的情况下:
<!-- <?import org.m2l.application.MultiSelectTableView?> -->)
现在,在Scenebuilder中,转到jar / FXML导入(单击搜索文本字段附近的图标),然后选择您的jar文件 关闭Scenebuilder。 在fxml scenebuilder中,取消注释导入...
现在,scenebuilder不会抛出Class Not Found异常,现在可以了。