2012-04-06 4 views
4

ここにTableViewの列にButtonを入れる方法を示すSSCCEがあります。それは動作しますが、不快な動作はほとんどありません。スクロールバーを使用してテーブル行をマウスでまでスクロールすると、新しいレンダリングされたボタンはすぐに表示されません。マウスが離されて移動されたときにのみ表示されます。私は、テーブルの列にボタンを表示し、選択された行に関連する何かをクリックしたときに、もう少しエレガントな方法があると思います。助言がありますか?よりエレガントにテーブルの列にボタンを置く

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.StackPaneBuilder; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class ButtonDemo extends Application { 

    private TableView<Person> personTable = new TableView<>(); 
    private TableColumn<Person, String> nameCol = new TableColumn<>("name"); 
    private TableColumn<Person, Double> salaryCol = new TableColumn<>("salary"); 
    private TableColumn<Person, String> actionCol = new TableColumn<>("action"); 

    @Override 
    public void start(Stage primaryStage) { 
     ObservableList<Person> data = FXCollections.observableArrayList(); 
     for (int i = 0; i < 40; i++) { 
      data.add(new Person("person_" + i, i * 100d)); 
     } 

     nameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("name")); 
     salaryCol.setCellValueFactory(new PropertyValueFactory<Person, Double>("salary")); 
     actionCol.setCellValueFactory(new PropertyValueFactory<Person, String>("name")); // "name" here is for just to render the column 

     Callback<TableColumn<Person, String>, TableCell<Person, String>> printColumnCellFactory = // 
       new Callback<TableColumn<Person, String>, TableCell<Person, String>>() { 

      @Override 
      public TableCell call(final TableColumn param) { 
       final TableCell cell = new TableCell() { 

        @Override 
        public void updateItem(Object item, boolean empty) { 
         super.updateItem(item, empty); 
         if (empty) { 
          setText(null); 
          setGraphic(null); 
         } else { 
          final Button btnPrint = new Button("print name"); 
          btnPrint.setOnAction(new EventHandler<ActionEvent>() { 

           @Override 
           public void handle(ActionEvent event) { 
            param.getTableView().getSelectionModel().select(getIndex()); 
            Person item = personTable.getSelectionModel().getSelectedItem(); 
            if (item != null) { 
             System.out.println(item.getName()); 
            } 
           } 
          }); 
          setGraphic(btnPrint); 
          setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
         } 
        } 
       }; 
       return cell; 
      } 
     }; 
     actionCol.setCellFactory(printColumnCellFactory); 

     personTable.setItems(data); 
     personTable.getColumns().addAll(nameCol, salaryCol, actionCol); 
     StackPane root = StackPaneBuilder.create().children(personTable).build(); 
     primaryStage.setScene(new Scene(root, 300, 250)); 
     primaryStage.show(); 
    } 

    public class Person { 

     private String name; 
     private Double salary; 

     public Person(String name, Double salary) { 
      this.name = name; 
      this.salary = salary; 
     } 

     public String getName() { 
      return name; 
     } 

     public Double getSalary() { 
      return salary; 
     } 
    } 

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

FXのどのバージョンを使用していますか? FX 2.1の最新のdevビルドで問題を再現できません - http://www.oracle.com/technetwork/java/javafx/downloads/devpreview-1429449.html –

+0

現在、私はjavaFX 2.0.1を使用しています。マウスの中央ボタンをスクロールに使用すると、列のボタンがすぐに表示されます。問題は、テーブルのスクロールバーをドラッグしてスクロールすると発生します。私が掲示したコード例では、スクロールバーを同時に上下にドラッグすると、すべてのボタンが消えてしまいます。 –

+0

はバグのようであり、コードは正しいです。おそらく2.1devにアップグレードしたいのですか? - マウスでスクロールしているスクロールがそこで動作します。 –

答えて

0

バージョン2.1にアップグレードすると問題が解決しました。