2012-09-20 12 views
5

में स्क्रॉल करते हैं, मैं दो टेबलव्यू एक साथ बांधना चाहता हूं जैसे कि वे सिंक में स्क्रॉल करते हैं। मैं उसको कैसे करू? मैं तालिकादृश्य के स्क्रॉलबार तक पहुंचने का तरीका जानने में असमर्थ हूं।दो टेबलव्यू एक साथ बाध्यकारी जैसे कि वे सिंक

उत्तर

1

मुझे नहीं लगता कि यह वर्तमान में संभव है। TableViewSkin वर्चुअलकॉन्टेनरबेस से विरासत में है जिसमें वर्चुअलफ्लो फ़ील्ड है। वर्चुअलफ्लो ऑब्जेक्ट में दो वर्चुअलस्क्रोलबार फ़ील्ड, हबर और vbar हैं जो आप के बाद हैं। हालांकि मुझे इसे पाने का कोई तरीका नहीं दिख रहा है।

दिलचस्प बात यह है कि टेबलव्यू में एक निजी सामग्रीविड्थ फ़ील्ड भी है हालांकि यह निजी है। मुझे यकीन है कि जेएफएक्स टीम बहुत अधिक एपीआई खोलने के बारे में अति सतर्क है जो समझ में आता है। आप सामग्री प्राप्त करने के लिए कह सकते हैं WIDTH फ़ील्ड जेएफएक्स जेआईआरए या ओपनजेएफएक्स-डीई मेलिंग सूची पर फीचर अनुरोध के रूप में एक इंट प्रॉपर्टी के रूप में खोला गया है।

एक स्टॉप गैप उपाय तालिका दृश्य चयन मॉडल के चयनित आइटम या इंडेक्स प्रॉपर्टी को बाध्य करना होगा।

+0

इनपुट के लिए धन्यवाद। नकारात्मक उत्तरों को स्वीकार करने के लिए कस्टम क्या है? मुझे नहीं पता कि यह वास्तव में असंभव है या नहीं - और यह साबित करना निश्चित रूप से असंभव है। कम से कम छह और दिन इंतजार करेंगे। –

5

मैंने बाहरी स्क्रॉलबार के साथ एक टेबलव्यू बांधने के लिए एक सीएसएस हैक बनाया है। एक स्क्रॉलबार दोनों टेबलव्यू को नियंत्रित करता है।

मेरा विचार का अवलोकन:

  • दो tableviews
  • एक कार्यक्षेत्र स्क्रॉलबार बनाने बनाएँ। इसे इस उदाहरण
  • मिनट और myScrollbar के मिनट के आकार के अधिकतम सेट में myScrollbar कहते हैं = 0, अधिकतम = TableView.Items.size()
  • जब myScrollbar परिवर्तन का मूल्य तो दोनों tableview के scrollTo (int) कहते हैं फ़ंक्शन
  • सीएसएस के साथ लागू तालिकादृश्य के मूल लंबवत स्क्रॉलबार को अक्षम करें।

यह आपको दो टेबल देगा, दोनों एक बाहरी स्क्रॉलबार (myScrollbar) द्वारा नियंत्रित किया जाएगा।

/* The main scrollbar **track** CSS class */ 

.mytableview .scroll-bar:vertical .track{ 
     -fx-padding:0px; 
    -fx-background-color:transparent; 
    -fx-border-color:transparent; 
    -fx-background-radius: 0em; 
    -fx-border-radius:2em; 

} 

/* The increment and decrement button CSS class of scrollbar */ 

.mytableview .scroll-bar:vertical .increment-button , 
.mytableview .scroll-bar:vertical .decrement-button { 

    -fx-background-color:transparent; 
    -fx-background-radius: 0em; 
    -fx-padding:0 0 0 0; 
} 

.mytableview .scroll-bar:vertical .increment-arrow, 
.mytableview .scroll-bar:vertical .decrement-arrow 
{ 
    -fx-shape: " "; 
    -fx-padding:0;   
} 

/* The main scrollbar **thumb** CSS class which we drag every time (movable) */ 
.mytableview .scroll-bar:vertical .thumb { 
    -fx-background-color:transparent; 
    -fx-background-insets: 0, 0, 0; 
    -fx-background-radius: 2em; 
    -fx-padding:0px; 

} 

फिर हम स्क्रॉलबार का उपयोग करके tableview स्क्रॉल करने के लिए कैसे निर्धारित करने की आवश्यकता:

यहाँ एक tableview सीएसएस का उपयोग करने का स्क्रॉलबार को छिपाने के लिए कोड है।

scroll.setMax(100); //make sure the max is equal to the size of the table row data. 
scroll.setMin(0); 
scroll.valueProperty().addListener(new ChangeListener(){ 

    @Override 
    public void changed(ObservableValue ov, Number t, Number t1) { 
     //Scroll your tableview according to the table row index 
     table1.scrollTo(t1.intValue()); 
     table2.scrollTo(t1.intValue()); 
    } 

}); 

http://blog.ngopal.com.np/2012/09/25/how-to-bind-vertical-scroll-in-multi-tableview/

+0

समाधान बहुत अच्छा लग रहा है।इसे एक पोस्ट के रूप में लिखें ताकि यह स्टैक ओवरफ़्लो पर संग्रहीत हो और मैं आपको बक्षीस दूंगा। –

+0

धन्यवाद..और चीयर्स :) – privatejava

1

सबसे आसान तरीका है मैं इस समस्या को हल करने के मिल गया है दिखाई की valueProperty एक छिपा स्क्रॉलबार बाध्य करने के लिए है।

// Controller 
@FXML private TableView<MyBean> tableLeft; 
@FXML private TableView<MyBean> tableRight; 
@FXML private ScrollBar scrollBar; 


@SuppressWarnings("rawtypes") 
private void bindScrollBars(TableView<?> tableView1, TableView<?> tableView2, 
       ScrollBar scrollBar, Orientation orientation) { 

    // Get the scrollbar of first table 
    VirtualFlow vf = (VirtualFlow)tableView1.getChildrenUnmodifiable().get(1); 
    ScrollBar scrollBar1 = null; 
    for (final Node subNode: vf.getChildrenUnmodifiable()) { 
     if (subNode instanceof ScrollBar && 
       ((ScrollBar)subNode).getOrientation() == orientation) { 
      scrollBar1 = (ScrollBar)subNode; 
     } 
    } 

    // Get the scrollbar of second table 
    vf = (VirtualFlow)tableView2.getChildrenUnmodifiable().get(1); 
    ScrollBar scrollBar2 = null; 
    for (final Node subNode: vf.getChildrenUnmodifiable()) { 
     if (subNode instanceof ScrollBar && 
       ((ScrollBar)subNode).getOrientation() == orientation) { 
      scrollBar2 = (ScrollBar)subNode; 
     } 
    } 

    // Set min/max of visible scrollbar to min/max of a table scrollbar 
    scrollBar.setMin(scrollBar1.getMin()); 
    scrollBar.setMax(scrollBar1.getMax()); 

    // bind the hidden scrollbar valueProterty the visible scrollbar 
    scrollBar.valueProperty().bindBidirectional(scrollBar1.valueProperty()); 
    scrollBar.valueProperty().bindBidirectional(scrollBar2.valueProperty()); 
} 

/* 
* This method must be called in Application.start() after the stage is shown, 
* because the hidden scrollbars exist only when the tables are rendered 
*/ 
public void setScrollBarBinding() { 
    bindScrollBars(this.tableLeft, this.tableRight, this.scrollBar, Orientation.VERTICAL); 
} 

अब आप चरण दिखाया गया है के बाद आवेदन से बाध्यकारी कॉल करनी होगी और टेबल प्रदान की जाती हैं:

// Application 
    private MyController controller; 

    @Override 
    public void start(Stage primaryStage) { 
     try { 
      FXMLLoader fxmlLoader = new FXMLLoader(SalesApp.class.getResource("scene.fxml")); 
      BorderPane root = (BorderPane) fxmlLoader.load();; 
      Scene scene = new Scene(root); 
      scene.getStylesheets().add(getClass().getResource("app.css").toExternalForm()); 
      primaryStage.setScene(scene); 
      primaryStage.show();    
controller = (MyController) fxmlLoader.getController(); 
      controller.setScrollBarBinding(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

अब टेबल माउस, कुंजी, या स्क्रॉलबार के माध्यम से तुल्यकालिक स्क्रॉल करना चाहिए।

मज़े करें, ओलाफ

संबंधित मुद्दे