2016-03-21 28 views
-2

yılında düğmeden nasıl ekleneceği aşağıda resimdeki gibi remove düğmesi ile bir ComboBox oluşturmak istiyorum:combobox

enter image description here

resim Java Swing kullanır ve ben nasıl yapılacağını bilmiyorum bu JavaFX ile. İki ComboBox (a, b) oluşturmak istiyorum. ComboBox'taki "cross" a tıkladığımda, bir öğeyi kaldırmak ve bu öğeyi ComboBox b'ye ve ComboBox b'ye eklemek istiyorum.

ComboBox a: (1) Daha sonra mal çıkarın ve b

ComboBox b eklemek tıklayın: (1) tıklayın madde daha sonra yapılacak bir şey (örn: Baskı öğesi)

(2) ardından çapraz tıklayın b çıkarın ve bir

eklenti
package UnitTest; 

import Peer.Peer_Manager; 
import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.chart.XYChart; 
import javafx.geometry.Insets; 
import javafx.scene.control.ComboBox; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 

import javafx.scene.text.Text; 

public class temp extends Application { 
    final int height = 200; 
    final int weight = 300; 
    final int offset = 5; 
    Peer_Manager p_management; 
    XYChart.Series series_hop; 
    XYChart.Series series_gd; 

    @Override 
    public void start(Stage primaryStage) { 
     VBox vbox = new VBox(); 
     vbox.setPadding(new Insets(5, 5, 5, 5)); 
     vbox.setStyle("-fx-background-color: CORNSILK;"); 

     Scene scene = new Scene(vbox, weight, height); 
     primaryStage.setScene(scene); 

     HBox hbBtn = new HBox(); 
     Text t1=new Text(" A:"); 
     Text t2=new Text(" B:"); 

     String[] filename = {"A","B","C"};//conf.load_all(); 
     ComboBox<String> cb = new ComboBox<String>(); 
     cb.setItems(FXCollections.observableArrayList(filename)); 
     cb.setVisibleRowCount(10); 

     ComboBox<String> cb2 = new ComboBox<String>(); 
     cb.setVisibleRowCount(10); 

     vbox.getChildren().add(hbBtn); 
     hbBtn.getChildren().add(t1); 
     hbBtn.getChildren().add(cb); 
     hbBtn.getChildren().add(t2); 
     hbBtn.getChildren().add(cb2); 

     cb.setOnAction(e -> { 
      try { 
       Object object = cb.getValue(); 
       if (object != null) { 
        cb2.getItems().add(object); 
        cb.getSelectionModel().clearSelection(); 
        cb.getItems().remove(object); 
       } 
      } catch (Exception e1) { 
       e1.printStackTrace(); 
      } 
     }); 

     //would like to do something(ex:print item),but don't remove 
     //add the "cross" beside items,click "cross" to remove item and add on cb 
     cb2.setOnAction(e -> { 
      try { 
       Object object = cb2.getValue(); 
       System.out.println(object); 
       if (object != null) { 
        cb1.getItems().add(object); 
        cb2.getSelectionModel().clearSelection(); 
        cb2.getItems().remove(object); 
       } 

      } catch (Exception e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
      } 
     }); 
     primaryStage.setTitle("SimulatorFX"); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

Hiç bir kodunuz var mı? – Joris

+0

Lütfen sorunuz [değiştir] ve sorun yaşadığınız şeyin bir [mcve] bölümünü ekleyin. –

+0

ControlsFX'ten [CheckComboBox] (http://fxexperience.com/controlsfx/features/#checked) adresini ziyaret edebilirsiniz. – Itai

cevap

2

Doğru yol, CellFactory kullanmak ve sahip olmak istediğiniz öğeleri içeren grafik düğümleri oluşturmaktır. İşte bir örnek:

public void start(Stage primaryStage) throws Exception { 
    ComboBox<String> cba = new ComboBox<>(); 
    ComboBox<String> cbb = new ComboBox<>(); 
    cba.getItems().addAll("A", "B", "C"); 
    cbb.getItems().addAll("123", "456", "789"); 

    // Set a cell factory for ComboBox A. A similar thing should be done for B. 
    cba.setCellFactory(lv -> 
      new ListCell<String>() { 
       // This is the node that will display the text and the cross. 
       // I chose a hyperlink, but you can change to button, image, etc. 
       private HBox graphic; 

       // this is the constructor for the anonymous class. 
       { 
        Label label = new Label(); 
        // Bind the label text to the item property. If your ComboBox items are not Strings you should use a converter. 
        label.textProperty().bind(itemProperty()); 
        // Set max width to infinity so the cross is all the way to the right. 
        label.setMaxWidth(Double.POSITIVE_INFINITY); 
        // We have to modify the hiding behavior of the ComboBox to allow clicking on the hyperlink, 
        // so we need to hide the ComboBox when the label is clicked (item selected). 
        label.setOnMouseClicked(event -> cba.hide()); 

        Hyperlink cross = new Hyperlink("X"); 
        cross.setVisited(true); // So it is black, and not blue. 
        cross.setOnAction(event -> 
          { 
           // Since the ListView reuses cells, we need to get the item first, before making changes. 
           String item = getItem(); 
           System.out.println("Clicked cross on " + item); 
           if (isSelected()) { 
            // Not entirely sure if this is needed. 
            cba.getSelectionModel().select(null); 
           } 
           // Remove the item from A and add to B. You can add any additional logic in here. 
           cba.getItems().remove(item); 
           cbb.getItems().add(item); 
          } 
        ); 
        // Arrange controls in a HBox, and set display to graphic only (the text is included in the graphic in this implementation). 
        graphic = new HBox(label, cross); 
        graphic.setHgrow(label, Priority.ALWAYS); 
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
       } 

       @Override 
       protected void updateItem(String item, boolean empty) { 
        super.updateItem(item, empty); 
        if (empty) { 
         setGraphic(null); 
        } else { 
         setGraphic(graphic); 
        } 
       } 
      }); 

    // We have to set a custom skin, otherwise the ComboBox disappears before the click on the Hyperlink is registered. 
    cba.setSkin(new ComboBoxListViewSkin<String>(cba) { 
     @Override 
     protected boolean isHideOnClickEnabled() { 
      return false; 
     } 
    }); 

    VBox vb = new VBox(cba, cbb); 
    primaryStage.setScene(new Scene(vb)); 
    primaryStage.show(); 
} 
+0

Sadece 'setSkin()' çağrısının herhangi bir yere yerleştirilemediğini ekledikten sonra, bir Denetleyicinin kurucusundan sonra derhal cildin 'dispose()' (d) 'a neden olmasını ve bu durumun o olduğunu anladım. 'NullPointerException' kaynağını' ComboBox'ı gösterirken karşılaşıyordum. Kurucudaki yeni cildin ayarlanması bunu çözdü. – Arno