代码之家  ›  专栏  ›  技术社区  ›  RDM

SWT:表大小调整问题

  •  0
  • RDM  · 技术社区  · 9 年前

    我正在做一个家庭作业项目,其中向用户显示产品目录,然后用户从目录中选择产品进行购买。

    我决定使用SWT构建一个基本UI。更不用说我刚刚开始学习SWT。

    这就是我到目前为止所做的。UI的第一个组件是 Table 其显示产品目录。代码片段:

    private void displayProductCatalog(List<Product> productList) {
            Group group = new Group(shell, SWT.NULL);
            group.setLayout(new GridLayout());
            Label label = new Label(group, SWT.NULL);
            label.setAlignment(SWT.CENTER);
            label.setText("Plese select a product by clicking on the desired row.");
    
            Table table = new Table(group, SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION);
            table.setLinesVisible(true);
            table.setHeaderVisible(true);
            GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
            table.setLayoutData(data);
            String[] titles = { "Product ID", "Product Description", "Cost" };
            for (int i = 0; i < titles.length; i++) {
                TableColumn column = new TableColumn(table, SWT.BOLD | SWT.CENTER);
                column.setText(titles[i]);
                column.setWidth(300);
            }
    
            String currency = " " + CurrencyHelper.fetchCurrency();
    
            for (Product product : productList) {
                ProductDescription productDescription = product.getProductDescription();
                TableItem item = new TableItem(table, SWT.NONE);
                item.setText(0, productDescription.getProductId());
                item.setText(1, productDescription.getDescription());
                item.setText(2, productDescription.getPrice().toString() + currency);
            }
    
            table.addSelectionListener(new TableRowSelectionListener(vendingMachine));
        }
    

    那么下一个组件又是一个只有两列的表。当用户单击产品目录上的任何一行时,将调用服务器执行一些验证,并计算含税的最终价格。然后,第二个表中填充了各种税收,这些税收与最终价格一起应用。所以在启动时,填充产品目录表,并创建第二个表,但保留为空(当用户进行选择时填充)。代码片段:

    private void displaySaleLineItem(List<Product> productList) {
            Group group = new Group(shell, SWT.NULL);
            group.setLayout(new GridLayout());
            Label label = new Label(group, SWT.NULL);
            label.setAlignment(SWT.CENTER);
            label.setText("Product Details.");
    
            saleLineItemTable = new Table(group, SWT.BORDER);
            saleLineItemTable.setLinesVisible(true);
            saleLineItemTable.setHeaderVisible(true);
            // GridData data = new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1);
            // saleLineItemTable.setLayoutData(data);
            for (int i = 0; i < 2; i++) {
                TableColumn column = new TableColumn(saleLineItemTable, SWT.BOLD | SWT.CENTER);
                column.setWidth(450);
            }
        }
    

    正在填充第二个表的代码段:

    @Override
        public void onPropertyEventBeforeSale(Sale sale) {
            TableItem item = new TableItem(saleLineItemTable, SWT.NONE);
            item.setText(0, sale.getProduct().getProductDescription().getDescription());
            item.setText(1, sale.getProduct().getProductDescription().getPrice().toString());
    
            for (TaxTypeModel taxTypeModel : sale.getTaxModel().getTaxTypeModelList()) {
                item = new TableItem(saleLineItemTable, SWT.NONE);
                item.setText(0, taxTypeModel.getTaxName());
                item.setText(1, taxTypeModel.getTaxValue().toString() + "%");
            }
    
            item = new TableItem(saleLineItemTable, SWT.NONE);
            item.setText(0, "TOTAL");
            item.setText(1, sale.getTaxModel().getProductPriceIncludingTax().toString());
        }
    

    UI启动时:

    enter image description here

    用户选择产品时: enter image description here

    你能帮我一下吗。我不知道这里到底出了什么问题。

    1 回复  |  直到 9 年前
        1
  •  2
  •   greg-449    9 年前

    如果你想要 Shell 包含要调整大小的数据,您需要调用 pack() 方法 在向表中添加条目之后。这将导致外壳重新计算外壳大小,并重做组件布局。