2014-01-16 2 views
5

Я заполняю ComboBox с использованием текстовых объектов. Использование текстовых объектов, а не строк позволяет мне добавить значение id, которое я могу использовать в своей программе, а затем использовать, когда я решаю интернационализировать пользовательский интерфейс. Во всяком случае, вот что я делаю: Основной класс:Управление элементами ComboBox в JavaFX

public class MainApp extends Application { 

private Stage primaryStage; 

@Override 
public void start(Stage primaryStage) { 
    this.primaryStage = primaryStage; 
    try { 
     AnchorPane paneMain = (AnchorPane) FXMLLoader.load(getClass().getResource("Test.fxml")); 
     Scene scene = new Scene(paneMain); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
public static void main(String[] args) { 
    launch(args); 
} 

}

Контроллер:

public class Test implements Initializable{ 

@FXML 
private AnchorPane anchorPane; 
@FXML 
private ComboBox<Text> comboTime; 
private Text days; 
private Text hours; 
private Text minutes; 
private int timeMultiplier; 

public Test(){ 
    days = new Text("Days"); 
    days.setId("86400000"); 
    hours = new Text("Hours"); 
    hours.setId("3600000"); 
    minutes = new Text("Minutes"); 
    minutes.setId("3600000"); 
    timeMultiplier = 0; 
} 

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    comboTime.getItems().removeAll(comboTime.getItems()); 
    comboTime.getItems().addAll(days, hours, minutes); 
    comboTime.getSelectionModel().select(hours); 

} 

@FXML 
private void setTimeMultiplier(){ 
    Text text = comboTime.getSelectionModel().getSelectedItem(); 
    timeMultiplier = Integer.valueOf(text.getId()); 
} 

} 

Test.fxml:

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

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.collections.*?> 
<?import javafx.geometry.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.paint.*?> 
<?import javafx.scene.text.*?> 

<AnchorPane id="AnchorPane" fx:id="anchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="100.99990000000253" prefWidth="94.99990000000253" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="com.spacitron.backupp.ui.controllers.Test"> 
    <children> 
    <HBox id="HBox" alignment="CENTER" layoutX="41.0" layoutY="224.0" prefWidth="216.0" spacing="5.0" /> 
    <ComboBox id="comboInterval" fx:id="comboTime" editable="false" layoutX="14.0" layoutY="22.0" onAction="#setTimeMultiplier"> 
     <items> 
     <FXCollections fx:factory="observableArrayList"> 
      <String fx:value="Item 1" /> 
      <String fx:value="Item 2" /> 
      <String fx:value="Item 3" /> 
     </FXCollections> 
     </items> 
    </ComboBox> 
    </children> 
</AnchorPane> 

Теперь, это работает просто хорошо. Однако проблема в том, что при выборе пункта текст по этому пункту гаснет так:

enter image description here

И если я выбираю другой, что тоже исчезает:

enter image description here

I все еще можно выбрать элементы, но их просто не видно. Это ошибка, и если это так?

отредактирован обеспечить MCVE

+1

Если вы разместите MCVE Http: // StackOverflow .com/help/mcve люди могут попробовать его на своих машинах для вас. – Goibniu

+0

@Goibniu Редактировать сделано. – spacitron

+2

Я посмотрел документацию для ComboBox (которая была добавлена ​​только в JavaFx2.1 +, поэтому я не могу протестировать ваш код (извините). Но с самого начала у него есть предупреждение, что вы не должны добавлять экземпляры экземпляра напрямую, но следует использовать фабрику ячеек для создания ваших экземпляров: http://docs.oracle.com/javafx/2/api/javafx/scene/control/ComboBox.html Я не уверен, что это будет любое использование для вас, но сделайте снимок и посмотрите. – Goibniu

ответ

3

Вы не должны помещать текстовые узлы в ComboBox ... смотрите на этот вопрос, который поможет вам: setButtonCell for ComboBox