2017-10-23 23 views
0

tableViewの最初または最後の列の並べ替えを無効にしたい。 最初の列または最後の列は2つの方法で無効にできます。最初の列または最後の列は移動できませんが、どちらの方法でも最初の/最後の列に別の列をドラッグできます。どうすればこれを防ぐことができますか?私はいつも固定された列を持つために、何とか "障壁"をそこに置きたいと思っています。JavaFx:最初/最後の列の並べ替えを無効にする

firstColumn.impl_setReorderable(false); // I know the method is @Deprecated but it works :) 

他のソリューションはTableHeaderRowの参照を取得するために、反射となり、その後の並べ替えを無効にします。私はfirstColumnを無効にする方法

。しかし、このソリューションの問題点は、並べ替えのためにすべての列を無効にしている一方、最初または最後の列だけを必要としていることです。

どのようにすればいいのですか?

答えて

0

並べ替えを実行してから変更をリッスンできます。イベントの最後に、好きなように列を並べ替えることができます。列の並べ替えについての非常に便利なポストは、thisです(よく考えてみてください)。つまり、あなたのテーブルの肌のプロパティにリスナーを追加することができ、内部に次の操作を行います。ここでは

table.skinProperty().addListener((obs, oldSkin, newSkin) -> { 
    final TableHeaderRow header = (TableHeaderRow) table.lookup("TableHeaderRow"); 
    header.reorderingProperty().addListener((o, oldVal, newVal) -> { 
     ObservableList columns = table.getColumns(); 

     // If the first columns is not in the first index change it 
     if (columns.indexOf(firstNameCol) != 0) { 
       columns.remove(firstNameCol); 
       columns.add(0, firstNameCol); 
      } 
     // Use the same logic for the last column 
     if (columns.indexOf(phoneCol) != columns.size() - 1) { 
      columns.remove(phoneCol); 
      columns.add(columns.size() , phoneCol); 
     } 
    }); 
}); 

はフル実施例である:

import com.sun.javafx.scene.control.skin.TableHeaderRow; 

import javafx.application.Application; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.geometry.Insets; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.layout.VBox; 
import javafx.scene.text.Font; 
import javafx.stage.Stage; 

public class TestApp extends Application { 

    private TableView<Person> table = new TableView<Person>(); 
    private final ObservableList<Person> data = FXCollections.observableArrayList(
      new Person("Jacob", "Smith", "[email protected]", "845-548-600"), 
      new Person("Isabella", "Johnson", "[email protected]", "455-777-645"), 
      new Person("Ethan", "Williams", "[email protected]", "888-504-254"), 
      new Person("Emma", "Jones", "[email protected]", "123-548-350"), 
      new Person("Michael", "Brown", "[email protected]", "650-120-600")); 

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

    @Override 
    public void start(Stage stage) { 
     Scene scene = new Scene(new Group()); 
     stage.setTitle("Table View Sample"); 
     stage.setWidth(550); 
     stage.setHeight(500); 

     final Label label = new Label("Address Book"); 
     label.setFont(new Font("Arial", 20)); 

     table.setEditable(true); 

     TableColumn firstNameCol = new TableColumn("First Name"); 
     firstNameCol.setMinWidth(100); 
     firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName")); 

     TableColumn lastNameCol = new TableColumn("Last Name"); 
     lastNameCol.setMinWidth(100); 
     lastNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName")); 

     TableColumn emailCol = new TableColumn("Email"); 
     emailCol.setMinWidth(200); 
     emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>("email")); 

     TableColumn phoneCol = new TableColumn("Phone"); 
     phoneCol.setMinWidth(100); 
     phoneCol.setCellValueFactory(new PropertyValueFactory<Person, String>("phone")); 

     table.setItems(data); 
     table.getColumns().addAll(firstNameCol, lastNameCol, emailCol, phoneCol); 

     table.skinProperty().addListener((obs, oldSkin, newSkin) -> { 
      final TableHeaderRow header = (TableHeaderRow) table.lookup("TableHeaderRow"); 
      header.reorderingProperty().addListener((o, oldVal, newVal) -> { 
       ObservableList columns = table.getColumns(); 

       // If the first columns is not in the first index change it 
       if (columns.indexOf(firstNameCol) != 0) { 
        columns.remove(firstNameCol); 
        columns.add(0, firstNameCol); 
       } 
       // Use the same logic for the last column 
       if (columns.indexOf(phoneCol) != columns.size() - 1) { 
        columns.remove(phoneCol); 
        columns.add(columns.size(), phoneCol); 
       } 
      }); 
     }); 

     final VBox vbox = new VBox(); 
     vbox.setSpacing(5); 
     vbox.setPadding(new Insets(10, 0, 0, 10)); 
     vbox.getChildren().addAll(label, table); 

     ((Group) scene.getRoot()).getChildren().addAll(vbox); 

     stage.setScene(scene); 
     stage.show(); 
    } 

    public static class Person { 

     private final SimpleStringProperty firstName; 
     private final SimpleStringProperty lastName; 
     private final SimpleStringProperty email; 
     private final SimpleStringProperty phone; 

     private Person(String fName, String lName, String email, String phone) { 
      this.firstName = new SimpleStringProperty(fName); 
      this.lastName = new SimpleStringProperty(lName); 
      this.email = new SimpleStringProperty(email); 
      this.phone = new SimpleStringProperty(phone); 
     } 

     public String getPhone() { 
      return phone.get(); 
     } 

     public String getFirstName() { 
      return firstName.get(); 
     } 

     public String getLastName() { 
      return lastName.get(); 
     } 

     public String getEmail() { 
      return email.get(); 
     } 

    } 
} 

ます。また、ドラッグを防ぐためにfirstNameCol.impl_setReorderable(false);phoneCol.impl_setReorderable(false);を追加することができます最初と最後の列のも同様です。

+0

はい、これは動作していますが、私はあなたがそれを放置すれば場所を変えるかもしれないその動きさえも防ぐ方法があると思いました。最高の解決策は、最初の/最後の列にドラッグできないようにすることです。そうでない場合は、このようにします。 – Sunflame

+0

@Sunflameあなたはドラッグできないようにしたいカラムに 'impl_setReorderable(false);'を使うことができますが、私はビジュアルを防ぐ方法(少なくとも簡単な方法)はないと信じています列の並べ替えが行われていなくても、他の列をドラッグできない列にドラッグすることができます。 – JKostikiadis

+0

ええ、あなたはおそらく正しいでしょうが、最初に動かされた場合は小切手でその部分を使いました。その後、正しい場所に戻しました。最も洗練されたソリューションではありませんが、機能します。このソリューションの提案に感謝します。 – Sunflame

関連する問題