有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在Windows上使SWT按钮、文本和标签具有相同的高度?

我正在尝试制作一个用于聊天的GUI,我将三个SWT控件放在了一排

不幸的是,我找不到适合他们的漂亮路线

下面的代码

    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new GridLayout(3, false));

    Label firstLabel = new Label(shell, SWT.NONE);
    firstLabel.setText("PROMPT:");
    firstLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));

    Text firstText = new Text(shell, SWT.NONE);
    firstText.setText("hello");
    firstText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));

    Button firstButton = new Button(shell, SWT.PUSH);
    firstButton.setText("Say");
    firstButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));

    shell.pack();
    shell.open();
    shell.setSize(400, 300);

    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();

给予

enter image description here

也就是说,文本字段和按钮一样高,但文本并没有垂直居中

如果按照下面的方式对文本进行编码

    Text firstText = new Text(shell, SWT.NONE);
    firstText.setText("hello");
    firstText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

我去拿

enter image description here

最美的结果将由

    Text firstText = new Text(shell, SWT.BORDER);
    firstText.setText("hello");
    firstText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

这就是

enter image description here

但按钮也比文本稍高

更新

人们说他们在非windows平台上有很好的效果,但问题可能是如何控制SWT控件的填充/边距

更新2

即使在最好的情况下,文本字段的高度也比Windows上的按钮小,结果取决于平台

enter image description here


共 (2) 个答案

  1. # 1 楼答案

    下面是一个代码示例,可以让您了解如何解决问题:

    public static void main(String[] args)
    {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new GridLayout(3, false));
    
        Label firstLabel = new Label(shell, SWT.NONE);
        firstLabel.setText("PROMPT:");
        firstLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
    
        Text firstText = new Text(shell, SWT.BORDER);
        firstText.setText("hello");
        firstText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
    
        Button firstButton = new Button(shell, SWT.PUSH);
        firstButton.setText("Say");
        firstButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
    
        Label secondLabel = new Label(shell, SWT.NONE);
        secondLabel.setText("PROMPT:");
        secondLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, true));
    
        Text secondText = new Text(shell, SWT.BORDER | SWT.MULTI | SWT.WRAP);
        secondText.setText("hello");
        secondText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    
        Button secondButton = new Button(shell, SWT.PUSH);
        secondButton.setText("Say");
        secondButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, true));
    
        shell.pack();
        shell.open();
        shell.setSize(400, 300);
    
        while (!shell.isDisposed())
        {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
    

    看起来像这样:

    enter image description here

    没有SWT.BORDER

    enter image description here

  2. # 2 楼答案

    我使用一个自定义标签,将实际标签包装在复合材料中

    package org.treez.core.swt;
    
    import org.eclipse.jface.layout.GridDataFactory;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.graphics.Color;
    import org.eclipse.swt.graphics.Point;
    import org.eclipse.swt.graphics.Rectangle;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.ui.forms.widgets.FormToolkit;
    
    /**
     * A label composite that vertically aligns with Text
     * 
     */
    public class CustomLabel extends Composite {
    
        // #region ATTRIBUTES
    
        /**
         * The wrapped label
         */
        Label label;
    
        // #end region
    
        // #region CONSTRUCTORS
    
        /**
         * Constructor
         * @param toolkit 
         * 
         * @param parent
         * @param text
         */
        public CustomLabel(FormToolkit toolkit, Composite parent, String text) {
            super(parent, SWT.NONE);        
            setGridLayoutWithoutMargins(this);  
            Composite verticalAlignmentContainer = createContainer(parent, toolkit);
            label = toolkit.createLabel(verticalAlignmentContainer, text);      
        }
    
        // #end region
    
        // #region METHODS
    
        /**
         * Creates a wrapping container
         * 
         * @param parent
         * @param toolkit
         * @return
         */
        private static Composite createContainer(Composite parent,
                FormToolkit toolkit) {
            Composite container = toolkit.createComposite(parent,SWT.NONE);     
            setGridLayoutWithoutMargins(container);         
            return container;
        }
    
        /**
         * Sets the grid layout 
         * 
         * @param container
         */
        private static void setGridLayoutWithoutMargins(Composite container) {
            org.eclipse.swt.layout.GridLayout gridLayout = new org.eclipse.swt.layout.GridLayout(1,false);
            gridLayout.horizontalSpacing = 0;       
            gridLayout.verticalSpacing = 0;
            gridLayout.marginHeight = 0;
            gridLayout.marginWidth = 0;     
            container.setLayout(gridLayout);
    
            GridData gridData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
            container.setLayoutData(gridData);
        }
    
        /**
         * Sets a preferred width for short labels
         * 
         * @param preferredWidth
         */
        public void setPrefferedWidth(int preferredWidth) {
    
            int labelWidth = label.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
            if (labelWidth < preferredWidth) {
                GridDataFactory.fillDefaults().hint(preferredWidth, SWT.DEFAULT)
                        .applyTo(label);            
            }               
        }
    
        // #end region
    
        // #region ACCESSORS
    
        /**
         * Sets the text
         * 
         * @param text
         */
        public void setText(String text) {
            label.setText(text);
        }
    
        /**
         * Returns the text
         * 
         * @return
         */
        public String getText() {
            return label.getText();
        }
    
        /**
         * Sets the background color
         */
        @Override
        public void setBackground(Color color) {
            super.setBackground(color);
            label.setBackground(color);
        }
    
        /**
         * Return the size
         */
        @Override
        public Point getSize(){
            return label.getSize();
        }
    
        /**
         * Return the bounds
         */
        @Override
        public Rectangle getBounds(){
            return label.getBounds();
        }
    
        // #end region
    
    }