【问题标题】:Java's SWT: How to properly set GUI components?Java 的 SWT:如何正确设置 GUI 组件?
【发布时间】:2014-02-21 13:04:44
【问题描述】:

我正在尝试为国际象棋游戏创建一个 gui,并且可以使用一些帮助。
我设置了两个面板:左面板和右面板(主面板上的两个座位)。左侧面板将包含棋盘本身,右侧面板将包含更多小部件。
问题是,我只能将右侧面板放置在窗口的右侧。

首先给你一些背景知识,这是我希望它的外观:

它的外观如下:

我尝试用 FormLayout() 对象设置主面板(同时包含左右面板的那个),然后设置:

FormData form_data=new FormData();
form_data.left=new FormAttachment(left_panel);
right_panel.setLayoutData(form_data); 

但这并没有做任何事情。

以下是相关代码:

    shell=new Shell(display,SWT.DIALOG_TRIM);
    shell.setText("Chess");

    /*********************
     * setting main panel
     *********************/
    Composite main_panel=new Composite(shell, SWT.NONE);
    main_panel.setBackgroundImage(background); //size of this image is 800x650, which means it should encompass the left and right panels exactly
    main_panel.setBackgroundMode(SWT.INHERIT_DEFAULT);
    main_panel.setBounds(background.getBounds());
    main_panel.setLayout(new GridLayout(2,false);


    /*********************
     * setting left panel
     *********************/
    left_panel=new Composite(main_panel, SWT.NONE); 
    GridData data=new GridData(SWT.FILL, SWT.FILL, false, true);
data.widthHint = 650;
    left_panel.setLayoutData(data);

    board_panel=new Composite(left_panel,SWT.NONE);
    board_panel.setBackgroundImage(game_board); //size of this image is 520x520
    board_panel.setLocation(65, 65); //board size is 520x520, so this centralizes it in left panel


    /*********************
     * setting right panel
     *********************/
    right_panel=new Composite(main_panel, SWT.NONE);
    right_panel.setBackgroundImage(panel); //size of this image is 150x650
    right_panel.setLayoutData(new GridData(SWT.END, SWT.FILL, true, true));


    shell.pack();

顺便说一句,如果我没有什么特别的东西,我应该将 Composite 设置为什么样式?
(如您所见,我将其设置为 SWT.NO_RADIO_GROUP 因为我不知道该放什么...)

任何帮助将不胜感激。

**代码已编辑

【问题讨论】:

  • 使用SWT.NONESWT.BORDER 作为Composite 样式。

标签: java user-interface swt


【解决方案1】:

永远不要使用setBounds,除非绝对必要。请改用Layout

Here 是一个关于布局的优秀教程。


以下是一些示例代码,可以为您提供一个起点:

public static void main(String[] args)
{
    final Display display = new Display();

    Shell shell = new Shell(display);
    shell.setText("StackOverflow");
    shell.setLayout(new GridLayout(2, false));

    Composite chessBoard = new Composite(shell, SWT.BORDER);
    chessBoard.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

    Composite settings = new Composite(shell, SWT.BORDER);
    GridData data = new GridData(SWT.END, SWT.FILL, false, true);
    data.widthHint = 100;
    settings.setLayoutData(data);

    shell.pack();
    shell.open();
    shell.setSize(400, 200);
    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
}

看起来像这样:

【讨论】:

  • 谢谢,巴兹。虽然它似乎对你有用,但它对我不起作用。右面板仍然卡在窗口的左面板上(如上所述);我尝试将 GridLayout 设置为主面板布局,并为左右面板设置 GridData,并使用与您的帖子一样的确切参数,我还删除了对 setBounds 的调用并改用 setSize - 但似乎没有任何效果......顺便说一句,我还将您发布的代码复制到 eclipse 中的一个辅助项目中并在我的机器上运行,得到的结果与您发布的图片不同......我有两个小方形面板彼此相邻。
  • @so.very.tired 首先:请发布您修改后的代码。第二:是的,启动后它看起来确实不同,但如果你调整它,它看起来就像我的图像。立即更新代码和图像。
  • 非常感谢朋友的帮助。编辑了主帖。
猜你喜欢
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多