gpt4 book ai didi

java - JFace 对话框布局问题,在窗口边界之外绘制的小部件

转载 作者:行者123 更新时间:2023-12-02 03:03:23 25 4
gpt4 key购买 nike

我正在尝试布局一个对话框,左侧有一个滚动面板,右侧有一个 Canvas ,填充可用空间但不被按钮栏覆盖。在我的示例中可以看到我遇到的问题是,复合 Material 似乎认为它们有无限的空间来吸引自己,而我无法理解这应该如何与任何东西一起工作。

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

public class FMLDialog extends Dialog
{
public FMLDialog(Shell parentShell)
{
super(parentShell);
}


@Override
protected void configureShell(Shell shell)
{
super.configureShell(shell);
shell.setSize(new Point(700,500));
shell.setText("FML");
}

@Override
public Control createDialogArea(final Composite comp)
{

Composite content = (Composite) super.createDialogArea(comp);
Composite parent = new Composite(content, SWT.NONE);

GridLayout gridLayout1 = new GridLayout(1, false);
gridLayout1.verticalSpacing=10;
GridLayout gridLayout2 = new GridLayout(2, false);
parent.setLayout(gridLayout2);
parent.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));

final ScrolledComposite scroll = new ScrolledComposite(parent, SWT.V_SCROLL);
scroll.setExpandHorizontal(true);
scroll.setExpandVertical(true);

Composite optionsPanel = new Composite(scroll, SWT.BORDER);

optionsPanel.setSize(optionsPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
optionsPanel.setLayout(gridLayout1);
scroll.setContent(optionsPanel);

for (int i = 0; i < 200; i++) {
new Label(optionsPanel, SWT.NONE).setText("this is item " + i);
}

scroll.setSize(optionsPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT));

final Canvas c = new Canvas(parent, SWT.BORDER);
c.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
c.addPaintListener(new PaintListener() {

@Override
public void paintControl(PaintEvent e) {
Point size = c.getSize();
e.gc.drawText("Width: " + size.x + "\nHeight: " + size.y, 5, 5);
e.gc.drawOval(2, 2, size.x - 4, size.y - 4);
}
});

return content;

}

public static void main(String[] args) {
Display d = new Display();
Shell s = new Shell();

FMLDialog fml = new FMLDialog(s);
fml.open();
}

}

最佳答案

这里存在一些问题,首先是不调用 ScrolledComposite#setMinSize(),以及 GridDataLayout 的一些小问题。

这是代码的修改版本,可以运行:

public class FMLDialog extends Dialog
{
public FMLDialog(Shell parentShell)
{
super(parentShell);
}

@Override
protected void configureShell(Shell shell)
{
super.configureShell(shell);
shell.setSize(new Point(700, 500));
shell.setText("FML");
}

@Override
public Control createDialogArea(final Composite comp)
{
Composite content = (Composite) super.createDialogArea(comp);
content.setLayout(new GridLayout(2, false));
content.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

final ScrolledComposite scroll = new ScrolledComposite(content, SWT.V_SCROLL);
scroll.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
scroll.setExpandHorizontal(true);
scroll.setExpandVertical(true);

Composite optionsPanel = new Composite(scroll, SWT.BORDER);
optionsPanel.setLayout(new FillLayout(SWT.VERTICAL));
optionsPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

for (int i = 0; i < 200; i++)
{
new Label(optionsPanel, SWT.NONE).setText("this is item " + i);
}

scroll.setContent(optionsPanel);
scroll.setMinSize(optionsPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT));

final Canvas c = new Canvas(content, SWT.BORDER);
c.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
c.addPaintListener(new PaintListener()
{
@Override
public void paintControl(PaintEvent e)
{
Point size = c.getSize();
e.gc.drawText("Width: " + size.x + "\nHeight: " + size.y, 5, 5);
e.gc.drawOval(2, 2, size.x - 4, size.y - 4);
}
});

return content;
}

public static void main(String[] args)
{
Display d = new Display();
Shell s = new Shell();

FMLDialog fml = new FMLDialog(s);
fml.open();
}
}

关于java - JFace 对话框布局问题,在窗口边界之外绘制的小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42119220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com