प्राप्त अद्वितीय स्तंभ चौड़ाई के लिए प्रत्येक कोशिका में अलग-अलग पंक्तियों के साथ एक GridPane?

0

सवाल

मैं कोशिश कर रहा हूँ करने के लिए मॉडल क्रेडिट कार्ड डेटा में JavaFx का उपयोग कर एक GridPane:

मेरे मॉडल शामिल हैं 3 पंक्तियों (नोट: प्रत्येक क्षेत्र के शामिल है लेबल पाठ क्षेत्र):

पंक्ति 1: प्रथम नाम और अंतिम नाम (4 क्षेत्रों)

पंक्ति 2: क्रेडिट कार्ड की संख्या (2 क्षेत्रों)

पंक्ति 3: समाप्ति की तारीख महीने, महीने + सीवीवी (6 क्षेत्रों)

नीचे स्क्रीनशॉट देखें:

Card Data Model

मैं पढ़ रहा था इस ट्यूटोरियल जो राज्यों:

सभी कोशिकाओं को एक ही पंक्ति में होगा एक ही ऊंचाई, और सभी कोशिकाओं में एक ही स्तंभ होगा एक ही चौड़ाई है. अलग-अलग पंक्तियों हो सकता है अलग हाइट्स और विभिन्न स्तंभों से अलग हो सकता है चौड़ाई.

वहाँ रहे हैं किसी भी workarounds के लिए है करने के लिए अलग अलग आकार स्तंभों की एक पंक्ति से पंक्ति के आधार में एक GridPane?

java javafx user-interface
2021-11-23 23:01:09
2

सबसे अच्छा जवाब

7

के लिए विशिष्ट लेआउट की छवि में, मैं एक का उपयोग करें VBox के साथ HBox पंक्तियों के लिए:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.geometry.Insets;
import javafx.geometry.Pos;

public class App extends Application {

    @Override
    public void start(Stage stage) {

        Label lblFirst = new Label("First");
        Label lblLast = new Label("Last");
        Label lblNumber = new Label("Card Number");
        Label lblMonth = new Label("Month");
        Label lblYear = new Label("Year");
        Label lblCVV = new Label("CVV");
        
        TextField txtFirst = new TextField();
        TextField txtLast = new TextField();
        TextField txtNumber = new TextField();
        TextField txtMonth = new TextField();
        TextField txtYear = new TextField();
        TextField txtCVV = new TextField();

        HBox row1 = new HBox(10);
        HBox row2 = new HBox(10);
        HBox row3 = new HBox(10);
        
        row1.getChildren().add(createCell(lblFirst, txtFirst));
        row1.getChildren().add(createCell(lblLast, txtLast));
        
        row2.getChildren().add(createCell(lblNumber, txtNumber));
        
        row3.getChildren().add(createCell(lblMonth, txtMonth));
        row3.getChildren().add(createCell(lblYear, txtYear));
        row3.getChildren().add(createCell(lblCVV, txtCVV));
        
        VBox rows = new VBox(10, row1, row2, row3);
        
        StackPane.setMargin(rows, new Insets(10));
        
        StackPane root = new StackPane(rows);

        Scene scene = new Scene(root);

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

    private static HBox createCell(Label label, TextField text) {
        HBox pane = new HBox(5, label, text);
        label.setMinWidth(Pane.USE_PREF_SIZE);
        text.setMinWidth(50);
        pane.setAlignment(Pos.CENTER);
        HBox.setHgrow(pane, Priority.ALWAYS);
        HBox.setHgrow(text, Priority.ALWAYS);
        return pane;
    }

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

}

आउटपुट:

2021-11-24 00:54:15

नहीं हार्ड कोड नौकरशाही का आकार घटाने के संकेत
kleopatra
5

+1 के लिए क्या @JamesD सुझाव और @ओबाउ जवाब. आदर्श रूप में मैं अलग-अलग प्रत्येक पंक्ति लेआउट, इसे संभाल करने के लिए आसान तरीके से बनाने की तुलना में यह जटिल का उपयोग केवल एक GridPane.

वाले ने कहा कि, अगर आप चाहते हैं के साथ जाने के लिए या सीखने के बारे में कैसे आप कर सकते हैं इसी तरह की layouting का उपयोग कर एक GridPane, नीचे implemenation दे सकता है आप एक त्वरित विचार है ।

सबसे पहले विभाजन अपने लेआउट में आवश्यक कॉलम, के लिए बाहर आंकड़ा कुल कितने कॉलम आप की जरूरत है. (के रूप में छवि के नीचे)

enter image description here

अब आप पता चल जाएगा कौन सा नोड में बैठ जाएगा, जो स्तंभ और कितने कॉलम यह कब्जा होगा (colspan)

मैं समझाने के लिए एक नोड:

चलो कहते हैं कि आप चाहते हैं फ़ील्ड सम्मिलित पहला नाम का. अगर तुम नोटिस चित्र में, यह rowIndex: 0, columnIndex: 1 और के कब्जे में है 4 कॉलम, तो colSpan मान 4 हो जाएगा. यहाँ हम नहीं कर रहे हैं के संयोजन के किसी भी पंक्तियों, तो रोस्पेन मान हमेशा 1 होगा.

pane.add(getField(), 1, 0, 4, 1); // node, colIndex, rowIndex, colSpan, rowSpan

इसी तरह से आप संबंधित कर सकते हैं के बाकी नोड्स layouting. और भी अधिक के लिए precising आप सेट कर सकते हैं पसंदीदा प्रत्येक स्तंभ की चौड़ाई का उपयोग कर ColumnConstraints. नीचे के लिए पूरा कोड के लेआउट और बाधाओं:

enter image description here

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class CreditCardPaneDemo extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        VBox root = new VBox();
        root.setPadding(new Insets(5));
        root.setSpacing(10);
        Scene scene = new Scene(root,300,200);
        stage.setScene(scene);
        stage.setTitle("CreditCard");
        stage.show();

        GridPane pane = new GridPane();
        pane.setStyle("-fx-border-color:black;-fx-border-width:1px;-fx-background-color:yellow");
        pane.setPadding(new Insets(5));
        pane.setHgap(5);
        pane.setVgap(5);

        pane.add(getLabel("First"), 0, 0, 1, 1);
        pane.add(getField(), 1, 0, 4, 1);
        pane.add(getLabel("Last"), 5, 0, 1, 1);
        pane.add(getField(), 6, 0, 2, 1);

        pane.add(getLabel("Card Number"), 0, 1, 3, 1);
        pane.add(getField(), 3, 1, 5, 1);

        pane.add(getLabel("Month"), 0, 2, 2, 1);
        pane.add(getField(), 2, 2, 2, 1);
        pane.add(getLabel("Year"), 4, 2, 1, 1);
        pane.add(getField(), 5, 2, 1, 1);
        pane.add(getLabel("CVV"), 6, 2, 1, 1);
        pane.add(getField(), 7, 2, 1, 1);

        pane.getColumnConstraints().addAll(getCc(70), getCc(20), getCc(80), getCc(20), getCc(25), getCc(90), getCc(80), getCc(100));

        CheckBox gridLines = new CheckBox("Show grid lines");
        gridLines.selectedProperty().addListener((obs, old, val) -> pane.gridLinesVisibleProperty().set(val));
        root.getChildren().addAll(gridLines, pane);
    }

    private ColumnConstraints getCc(double width) {
        ColumnConstraints cc = new ColumnConstraints();
        cc.setPrefWidth(width);
        return cc;
    }

    private Label getLabel(String txt) {
        Label lbl = new Label(txt);
        lbl.setMinWidth(Region.USE_PREF_SIZE);
        return lbl;
    }

    private TextField getField() {
        TextField field = new TextField();
        field.setMaxWidth(Double.MAX_VALUE);
        return field;
    }
}
2021-11-24 00:47:44

नहीं हार्ड कोड नौकरशाही का आकार घटाने के संकेत
kleopatra

@kleopatra, सुझाव के लिए धन्यवाद. अगर मैं सही ढंग से समझते हैं, आप कर रहे हैं के बारे में उल्लेख के उपयोग के USE_PREF_SIZE & MAX_VALUE. सही है? यदि हाँ, आप कर सकते हैं सुझाव है कि कृपया वैकल्पिक के लिए उन्हें का उपयोग कर के रूप में मैं नहीं कर सका एक रास्ता खोजने सुनिश्चित करने के लिए लेबल की न्यूनतम चौड़ाई दिखाने के लिए नहीं "..." और पाठ बक्से के लिए ऑटो खिंचाव उपलब्ध अंतरिक्ष. यदि नहीं, आप कर सकते हैं के बारे में एक सा समझाने के संकेत आप कर रहे हैं के बारे में बात कर.
Sai Dandem

नहीं, मैं मतलब हार्ड कोडित वास्तविक संख्या में पारित कर दिया getCc - प्रहरी परिभाषित क्षेत्र में ठीक कर रहे हैं के रूप में कर रहे हैं bounderies संख्या के स्पेक्ट्रम :)
kleopatra

लेकिन फिर, इस लेआउट है वैकृत से एक दृश्य डिजाइन परिप्रेक्ष्य - यह तोड़ने के प्रत्येक और हर एक नियम के रूप में कैसे डिजाइन करने के लिए एक अच्छा उपयोगकर्ता इंटरफ़ेस । तो आशा है कि यह सिर्फ एक व्यायाम जानने के लिए उपयोग और सीमाओं के gridpane ;)
kleopatra

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में