使用Java Swing使用for循环创建GUI

时间:2013-06-09 20:47:01

标签: java swing jradiobutton

我有一个GUI,从这个GUI我选择一个具有预订系统尺寸的输入文件(新的GUI)如果飞机有100个座位,GUI将是例如10x10,如果飞机有200个座位,它将是10x20,所有座位都将成为按钮,并且如果他们被预订则应该将乘客信息存储在他们身上。此外,预订的座位不会再被预订。

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

我想用for循环来做这个但是我不想把按钮从GUI中取出来。我不知道怎么能在任意旁边的另一个按钮旁边添加一个按钮。我总是使用Eclipse Window Builder来构建GUI,但我想我需要自己编写这个...有人可以帮我吗?有些提示吗?感谢您的时间!

2 个答案:

答案 0 :(得分:2)

尝试这样的事情:

// 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的位置,它仍然会在'design'标签中显示它们。

希望这有帮助!

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

要制作带循环的按钮,您需要一个缓冲区(存储一个足够长的临时按钮以添加到列表中)和......列表: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,右键单击您的项目&gt;构建路径&gt;配置构建路径&gt; “库”选项卡&gt;添加外部JAR&gt;找到您下载的swt文件并单击。

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

答案 1 :(得分:1)

GridLayout开头。每次需要更改座位布局时,请重新应用GridLayout

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

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

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

至于尺寸,您可能无法控制它,因为它在不同的屏幕上会有不同的显示方式。相反,您应该提供一些方法来阻止UI过度调整屏幕大小。

这可以通过将座位窗格放在JScrollPane内来实现。这将允许座椅窗格在尺寸上扩展和缩小,而不会在屏幕上过大尺寸

看看