2

我有一个 GUI,从这个 GUI 我选择一个具有预订系统尺寸的输入文件(新 GUI) 如果飞机有 100 个座位,则 GUI 将是例如 10x10,如果飞机有 200 个座位,它将是 10x20,所有座位将是按钮,如果已预订,应在其上存储乘客信息。此外,已预订的座位不得再次预订。

问题是 GUI 的尺寸会根据座位数量和方向而变化,这意味着在一个版本中可以有很多按钮,另一个版本更少,更多的座位意味着 GUI 将更长或更宽,可能是 10 厘米 x 10 厘米或 10 厘米 x 20 厘米,或 15 厘米 x 25 厘米...

我正在考虑使用 for 循环来执行此操作,但我不想将按钮放在 GUI 之外。我不知道如何在另一个按钮旁边任意添加一个按钮。我一直使用 Eclipse Window Builder 来构建 GUI,但我想我需要自己编写这个...有人可以帮助我吗?一些提示?感谢您的宝贵时间!

4

2 回答 2

2

GridLayout. 每次需要更改座位布局时,重新应用GridLayout.

即,如果您需要 100 个座位,请使用类似新的GridLayout(20, 10)...

就个人而言,我会使用 a GridBagLayout,但对于手头的任务可能会很复杂

添加/删除新内容有点困难。我个人会重建 UI 并将模型重新应用到它。

至于大小,您可能无法对其进行太多控制,因为它在不同屏幕上的显示方式会有所不同。相反,您应该提供可以防止 UI 过度调整屏幕大小的方法。

这可以通过将座椅窗格放置在JScrollPane. 这将允许座位窗格的大小扩大和缩小,而不会在屏幕上过度调整大小

看一眼

于 2013-06-09T20:59:06.397 回答
1

尝试这样的事情:

// The size of the window.
Rectangle bounds = this.getBounds();

// How many rows of buttons.
int numOfRows = 100;

// How many buttons per row.
int numOfColumns = 50;

int buttonWidth = bounds.width / numOfRows;
int buttonHeight = bounds.height / numOfColumns;

int x = 0;
int y = 0;

for(int i = 0; i < numOfColumns; i++){
    for(int j = 0; j < numOfRows; j++){
        // Make a button
        button.setBounds(x, y, buttonWidth, buttonHeight);
        y += buttonHeight;
    }
    x += buttonWidth;
}

这将使所有按钮都适合您的窗口。

这是一个关于矩形的链接,在做这样的事情时它们非常方便。 http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fswt%2Fgraphics%2FRectangle.html

此外,您仍然可以使用 windowbuilder,事实上我建议您这样做。它确实可以帮助您可视化所需的尺寸。并且您还可以使用代码手动创建东西(按钮、列表、下拉列表...等),并且假设您将变量放在 WindowBuilder 的位置,它仍然会在“设计”选项卡中显示它们。

希望这可以帮助!

编辑:我对如何使用循环制作按钮有点模糊

要制作带有循环的按钮,您将需要一个缓冲区(存储一个足够长的临时按钮以添加到列表中)和...一个列表:D。

它应该是这样的:

外循环:

// The list to store your buttons in.
ArrayList<Button> buttons = new ArrayList<Button>();

// The empty button to use as a buffer.
Button button;

内部循环(“//制作按钮”注释所在的位置):

button = new Button(this, SWT.NONE);
buttons.add(button);

现在您拥有所有按钮的列表,并且可以轻松访问它们并进行更改,例如更改按钮文本;

buttons.get(indexOfButton).setText("SomeText");

编辑:

看到你是 swt 的新手(而且我无法让 awt/JFrame 工作)这里是完整的代码。

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class ButtonTest extends Shell {

    /**
     * Launch the application.
     * @param args
     */

    // Code starts here in main.
    public static void main(String args[]) {
        try {
            Display display = Display.getDefault();
            // Creates a window (shell) called "shell"
            ButtonTest shell = new ButtonTest(display);
            // These two lines start the shell.
            shell.open();
            shell.layout();

            // Now we can start adding stuff to our shell.

            // The size of the window.
            Rectangle bounds = shell.getBounds();

            // How many rows of buttons.
            int numOfRows = 5;

            // How many buttons per row.
            int numOfColumns = 3;

            int buttonWidth = bounds.width / numOfRows;
            int buttonHeight = bounds.height / numOfColumns;

        Button button;

        int x = 0;
        int y = 0;

        for(int i = 0; i < numOfColumns; i++){
            for(int j = 0; j < numOfRows; j++){
                button = new Button(shell, SWT.NONE);
                button.setBounds(x, y, buttonWidth, buttonHeight);
                x += buttonWidth;
            }
            x = 0;
            y += buttonHeight;
        }



        // This loop keeps the shell from killing itself the moment it's opened
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * Create the shell.
 * @param display
 */
public ButtonTest(Display display) {
    super(display, SWT.SHELL_TRIM);
    createContents();
}

/**
 * Create contents of the shell.
 */
protected void createContents() {
    setText("SWT Application");
    setSize(800, 800);

}

@Override
protected void checkSubclass() {
    // Disable the check that prevents subclassing of SWT components
}

另外,我在嵌套循环中犯了一个小错误(并且忘记在每行之后将 x 值重置为 0)。它已在此编辑中修复。

此外,您需要导入 swt 才能使其正常工作。转到此处: http: //www.eclipse.org/swt/并下载适用于您的操作系统的最新版本,然后进入 eclipse,右键单击您的项目 > 构建路径 > 配置构建路径 > 库选项卡 > 添加外部 JAR > 查找您下载的 swt 文件并单击。

抱歉这么长的答案,希望对您有所帮助:D

于 2013-06-09T21:05:40.197 回答