- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试在水平 SashForm(父级)中实现上下 SashForm(子级 A 和 B)。我希望能够拖动其中一个 child ( child A)的(垂直)腰带,并让另一个 child ( child B)的(垂直)腰带完全模仿 A 的水平位置。为此,我尝试了一个 hack,创建了一个公开 SashForms 窗扇的“ModifiedSashForm”:
public Sash[] getSashes() {
return sashes;
然后我创建了一个扩展 ModifiedSashForm 并覆盖的类
public void onDragSash(Event event){
...
向听众(例如 child A)发送 B 的腰带已被拖动的注释: if(sash.getParent().getData(WidgetData.DATA_DRAG_SOURCE).equals(WidgetData.DRAG_SOURCE.SOURCE)){ fireSashDragged(事件,sashIndex); }}
然后 child A 将 B 的窗框替换为事件源(!):
if(sashes[sashIndex]!=null){
event.widget=sashes[sashIndex];
}
listener.onDragSash(event);
然后我得到了一个可以正常运行的图形用户界面。但是我遇到了窗扇不同步的问题。代码很糟糕,我不想以这种方式破坏 SWT。然后我尝试获取 child B 的权重并将它们插入 A - 但再次遇到问题 - 特别是当窗框被拖到彼此靠近时,听者的权重顺序翻转。
接下来我尝试使用 Sash 和 FormLayout。示例代码如下 - 但我仍然无法让上部垂直窗扇准确模仿下部垂直窗扇的运动,反之亦然。
//基于http://www.eclipse.org/swt/snippets/ SWT Snippet107
public class SashTest {
final private List<Sash> listeners = new ArrayList<Sash>();
private Shell shell;
public static void main(String[] args) {
new SashTest().run();
}
void run() {
Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("SashTest");
this.shell = shell;
init();
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
void init() {
final FormLayout form = new FormLayout();
shell.setLayout(form);
SashForm sashForm = new SashForm(shell, SWT.VERTICAL);
sashForm.setLayoutData(new FormData());
Composite comp1 = new Composite(sashForm, SWT.NONE);
comp1.setLayout(new FormLayout());
createTopArea(comp1);
Composite comp2 = new Composite(sashForm, SWT.NONE);
comp2.setLayout(new FormLayout());
createBottomArea(comp2);
}
void createTopArea(Composite comp) {
Button button1 = new Button(comp, SWT.PUSH);
FormData fd_button1 = new FormData();
fd_button1.bottom = new FormAttachment(0);
fd_button1.right = new FormAttachment(0);
fd_button1.top = new FormAttachment(0);
fd_button1.left = new FormAttachment(0);
button1.setLayoutData(fd_button1);
button1.setText("Button 1");
final Sash sash = new Sash(comp, SWT.VERTICAL);
FormData fd_sash = new FormData();
fd_sash.bottom = new FormAttachment(0);
fd_sash.right = new FormAttachment(0);
fd_sash.top = new FormAttachment(0);
fd_sash.left = new FormAttachment(0);
sash.setLayoutData(fd_sash);
//add the upper sash to listeners for bottom sash movement
listeners.add(sash);
Button button2 = new Button(comp, SWT.PUSH);
FormData fd_button2 = new FormData();
fd_button2.bottom = new FormAttachment(0);
fd_button2.right = new FormAttachment(0);
fd_button2.top = new FormAttachment(0);
fd_button2.left = new FormAttachment(0);
button2.setLayoutData(fd_button2);
button2.setText("Button 2");
FormData button1Data = new FormData();
button1Data.left = new FormAttachment(0, 0);
button1Data.right = new FormAttachment(sash, 0);
button1Data.top = new FormAttachment(0, 0);
button1Data.bottom = new FormAttachment(100, 0);
button1.setLayoutData(button1Data);
final int limit = 20, percent = 50;
final FormData sashData = new FormData();
sashData.left = new FormAttachment(percent, 0);
sashData.top = new FormAttachment(0, 0);
sashData.bottom = new FormAttachment(100, 0);
sash.setLayoutData(sashData);
sash.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event e) {
Rectangle sashRect = sash.getBounds();
Rectangle shellRect = shell.getClientArea();
int right = shellRect.width - sashRect.width - limit;
e.x = Math.max(Math.min(e.x, right), limit);
if (e.x != sashRect.x) {
sashData.left = new FormAttachment(0, e.x);
shell.layout();
notifyListeners(sashData);
}
}
});
FormData button2Data = new FormData();
button2Data.left = new FormAttachment(sash, 0);
button2Data.right = new FormAttachment(100, 0);
button2Data.top = new FormAttachment(0, 0);
button2Data.bottom = new FormAttachment(100, 0);
button2.setLayoutData(button2Data);
}
void createBottomArea(Composite comp) {
Button button3 = new Button(comp, SWT.PUSH);
FormData fd_button1 = new FormData();
fd_button1.bottom = new FormAttachment(0);
fd_button1.right = new FormAttachment(0);
fd_button1.top = new FormAttachment(0);
fd_button1.left = new FormAttachment(0);
button3.setLayoutData(fd_button1);
button3.setText("Button 3");
final Sash sash2 = new Sash(comp, SWT.VERTICAL);
FormData fd_sash2 = new FormData();
fd_sash2.bottom = new FormAttachment(0);
fd_sash2.right = new FormAttachment(0);
fd_sash2.top = new FormAttachment(0);
fd_sash2.left = new FormAttachment(0);
sash2.setLayoutData(fd_sash2);
Button button4 = new Button(comp, SWT.PUSH);
FormData fd_button2 = new FormData();
fd_button2.bottom = new FormAttachment(0);
fd_button2.right = new FormAttachment(0);
fd_button2.top = new FormAttachment(0);
fd_button2.left = new FormAttachment(0);
button4.setLayoutData(fd_button2);
button4.setText("Button 4");
FormData button3Data = new FormData();
button3Data.left = new FormAttachment(0, 0);
button3Data.right = new FormAttachment(sash2, 0);
button3Data.top = new FormAttachment(0, 0);
button3Data.bottom = new FormAttachment(100, 0);
button3.setLayoutData(button3Data);
final int limit = 20, percent = 50;
final FormData sashData2 = new FormData();
sashData2.left = new FormAttachment(percent, 0);
sashData2.top = new FormAttachment(0, 0);
sashData2.bottom = new FormAttachment(100, 0);
sash2.setLayoutData(sashData2);
sash2.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event e) {
Rectangle sashRect = sash2.getBounds();
Rectangle shellRect = shell.getClientArea();
int right = shellRect.width - sashRect.width - limit;
e.x = Math.max(Math.min(e.x, right), limit);
if (e.x != sashRect.x) {
sashData2.left = new FormAttachment(0, e.x);
shell.layout();
}
}
});
FormData button4Data = new FormData();
button4Data.left = new FormAttachment(sash2, 0);
button4Data.right = new FormAttachment(100, 0);
button4Data.top = new FormAttachment(0, 0);
button4Data.bottom = new FormAttachment(100, 0);
button4.setLayoutData(button4Data);
}
void notifyListeners(FormData formData){
for(Sash sash: listeners){
Rectangle sashRect = sash.getBounds();
FormData sashData = formData;
sash.setLayoutData(sashData);
shell.layout();
}
}
我是否必须编写自己的小部件才能执行此操作,或者可以使用 Sash/SashForm 实现?
Baz,我在这里编辑了你的类(class)(太大而无法评论):
public class SashMirror {
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setMinimumSize(new Point(200, 200));
shell.setText("StackOverflow");
shell.setLayout(new FillLayout(SWT.HORIZONTAL));
final SashForm divider = new SashForm(shell, SWT.VERTICAL);
divider.setLayout(new FillLayout(SWT.HORIZONTAL));
final SashForm top = new SashForm(divider, SWT.HORIZONTAL);
top.setLayout(new FillLayout(SWT.HORIZONTAL));
final SashForm bottom = new SashForm(divider, SWT.HORIZONTAL);
bottom.setLayout(new FillLayout(SWT.HORIZONTAL));
Canvas canvasTopLeft = new Canvas(top, SWT.NONE);
canvasTopLeft
.setBackground(SWTResourceManager.getColor(SWT.COLOR_CYAN));
canvasTopLeft.setLayout(new FillLayout(SWT.HORIZONTAL));
Canvas canvasTopMiddle = new Canvas(top, SWT.NONE);
canvasTopMiddle.setBackground(SWTResourceManager
.getColor(SWT.COLOR_WHITE));
canvasTopMiddle.setLayout(new FillLayout(SWT.HORIZONTAL));
Canvas canvasTopRight = new Canvas(top, SWT.NONE);
canvasTopRight.setBackground(SWTResourceManager
.getColor(SWT.COLOR_BLUE));
canvasTopRight.setLayout(new FillLayout(SWT.HORIZONTAL));
Canvas canvasBottomLeft = new Canvas(bottom, SWT.NONE);
canvasBottomLeft.setBackground(SWTResourceManager
.getColor(SWT.COLOR_DARK_YELLOW));
canvasBottomLeft.setLayout(new FillLayout(SWT.HORIZONTAL));
Canvas canvasBottomMiddle = new Canvas(bottom, SWT.NONE);
canvasBottomMiddle.setBackground(SWTResourceManager
.getColor(SWT.COLOR_DARK_RED));
canvasBottomMiddle.setLayout(new FillLayout(SWT.HORIZONTAL));
Canvas canvasBottomRight = new Canvas(bottom, SWT.NONE);
canvasBottomRight.setBackground(SWTResourceManager
.getColor(SWT.COLOR_DARK_GREEN));
canvasBottomRight.setLayout(new FillLayout(SWT.HORIZONTAL));
top.setWeights(new int[] { 2, 2, 2 });
bottom.setWeights(new int[] { 2, 2, 2 });
canvasBottomLeft.addListener(SWT.Resize, new Listener() {
@Override
public void handleEvent(Event arg0) {
top.setWeights(bottom.getWeights());
}
});
canvasTopLeft.addListener(SWT.Resize, new Listener() {
@Override
public void handleEvent(Event arg0) {
bottom.setWeights(top.getWeights());
}
});
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
最佳答案
这完美地工作:
public static void main(String[] args)
{
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("StackOverflow");
shell.setLayout(new GridLayout(1, false));
final SashForm top = new SashForm(shell, SWT.HORIZONTAL);
top.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
final SashForm bottom = new SashForm(shell, SWT.HORIZONTAL);
bottom.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Button topLeft = new Button(top, SWT.PUSH);
topLeft.setText("Top left");
new Button(top, SWT.PUSH).setText("Top right");
Button bottomLeft = new Button(bottom, SWT.PUSH);
bottomLeft.setText("Bottom left");
new Button(bottom, SWT.PUSH).setText("Bottom right");
topLeft.addListener(SWT.Resize, new Listener()
{
@Override
public void handleEvent(Event arg0)
{
bottom.setWeights(top.getWeights());
}
});
bottomLeft.addListener(SWT.Resize, new Listener()
{
@Override
public void handleEvent(Event arg0)
{
top.setWeights(bottom.getWeights());
}
});
top.setWeights(new int[] {1,2});
bottom.setWeights(new int[] {1,2});
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
}
调整大小之前:
调整大小后:
更新:
我注意到您实际调整大小的 SashForm
最终会不同步。我通过将 Listener
更改为:
topLeft.addListener(SWT.Resize, new Listener()
{
@Override
public void handleEvent(Event arg0)
{
bottom.setWeights(top.getWeights());
// Resize the source SashForm as well to fix out of sync!
top.setWeights(bottom.setWeights());
}
});
关于java - SWT Sash/SashForm 镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24015489/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!