2014-01-23 102 views
2

我已經在我的FXML文件中定義了一個css樣式表,當它用scenebuilder打開時,它顯示正確,但是當我運行該程序時,它不是。這混淆了我......JavaFX不加載css,因爲它在fxml中做的事

這就是我的工作:

├───bin 
│ └───app 
│   application.css 
│   Fxml.fxml 
│   Main.class 
│ 
└───src 
    └───app 
      application.css 
      Fxml.fxml 
      Main.java 

我Fxml.fxml文件看起來像這樣:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import java.net.URL?> 


<VBox prefHeight="100.0" xmlns="http://javafx.com/javafx/8" 
    xmlns:fx="http://javafx.com/fxml/1"> 
    <children> 
     <HBox prefHeight="20.0" /> 
     <TableView id="table" xmlns:fx="http://javafx.com/fxml"> 
      <columns> 
       <TableColumn id="tablec_h_from" text="H_FROM" /> 
       <!-- other columns --> 
      </columns> 
     </TableView> 
    </children> 
    <stylesheets> 
     <URL value="@application.css" /> 
    </stylesheets> 
</VBox> 

的application.css看起來是這樣的:

.table-column { 
    -fx-pref-width: 55; 
} 

的Main.java:

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
      VBox root = null; 
      try { 
       root = (VBox)FXMLLoader.load(getClass().getResource("Fxml.fxml")); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      Scene scene = new Scene(root); 

      primaryStage.setScene(scene); 
      primaryStage.show(); 

    } 
} 

因此,如前所述,當我使用場景構建器打開FXML文件時,表格列的寬度爲55px,但是當我運行程序時,表格列的默認寬度爲80 PX。目標當然是要有列55px的寬度。

我是否必須在Main.java中導入css文件,即使我已經在fxml文件中定義了它?如果是這樣,怎麼樣?

我使用的Eclipse IDE,和JavaFX版本2.2.45-B18

任何幫助表示讚賞。

+0

我有點困惑,你在運行程序時如何告訴列是80像素? printlines?當我運行上面的代碼時,我在sceneBuilder和應用程序的輸出中都得到了相同的結果。 – WillBD

+0

我使用一個程序,它顯示我相對於屏幕的指針位置,然後我做數學。 我試着複製我在新項目中寫的內容,並獲得與以前相同的結果。 我感興趣的是你得到的寬度是55還是80像素。如果你會那麼友好,你能修改那個css文件,比如說200px,然後告訴我你是否看到了差異? – SlumpA

+0

也許因爲我使用SceneBuilder 2.0(開發人員預覽版)而得到那個結果...... – SlumpA

回答

1

好吧,所以這個特定問題的問題是TableColumn的性質。看起來TableColumn沒有任何與.css的真實綁定,並且不止如此,即使你通過它的css ID訪問它,它的屬性-fx-pref-width似乎也不存在。這就是爲什麼你沒有看到任何改變。此外,由於目前javafx中tableView潛在的bug性質,你必須設置寬度前綴,否則事情會變得有點奇怪。看到 This topic爲一些奇怪的例子。

現在,解決方案是創建一個fxml控制器類並以編程方式設置寬度的值。我意識到這可能不完全適合您的解決方案,但它似乎工作得很好。例如:

我FXML.fxml:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.net.*?> 
<?import java.net.URL?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<VBox prefHeight="100.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller = "filechooserexample.fxmlController" > 
    <children> 
    <HBox prefHeight="20.0" /> 
    <TableView id="table"> 
     <columns> 
     <TableColumn id="tablec_h_from" maxWidth="5000.0" minWidth="10.0" prefWidth="50.0" text="H_FROM" fx:id="myTableColumn" /> 
     <!-- other columns --> 
     </columns> 
     <stylesheets> 
     <URL value="@application.css" /> 
     </stylesheets> 
    </TableView> 
    </children> 
    <stylesheets> 
    <URL value="@application.css" /> 
    </stylesheets> 
</VBox> 

我的主類是相同的,現在對於我的控制器:

fxmlController.java: 

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.TableColumn; 

/** 
* 
* @author William 
*/ 
public class fxmlController implements Initializable{ 

    @FXML TableColumn myTableColumn; 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     myTableColumn.setPrefWidth(200); 
    } 

} 

赦免怪異 'filechooserexample' 包在FXML控制器標籤setter字段,我正在重新使用一個我已經設置好的大部分空白的項目和一切。因此,設置控制器的代碼是:`fx:controller =「packageName.NameOfJavaClassNoExtension」'

使用該代碼我能夠成功設置寬度。現在,您可以使用css來設置表格列的樣式,您不能使用-fx-pref-width,因爲我相當肯定該屬性不存在。如果您想要猜測允許的內容,請參閱: caspian.css leview-resize-after-been-moved這是所有javafx的默認.css樣式表。除此之外,您可能會發現一個或兩個屬性,但不是您隨時可以看到的噸和噸。

同樣值得注意的是,要正確訪問表列,.table-column將不起作用,我不這麼認爲。您可能需要添加一個風格getStyleClass().add("myCustomStyle");

,你可以接着用.myCustomStyle

好運訪問!我希望有所幫助。

+0

不會使用''具有完全相同的效果? –

+0

@William謝謝您的解釋 – SlumpA

+0

@James_D我一直在尋找一種方式來設計所有TableColumns,而不僅僅是一種。我確實只在fxml中放置了一個tableColumn,但我並沒有用我認爲與我的問題無關的東西來使代碼飽和。 我其實正在嘗試學習如何在JavaFX中實現css。太糟糕了,我試圖用一個錯誤的例子來教自己一些事情。 :-) – SlumpA