【问题标题】:JTree does not extend automatically, Swing embedded into SWTJTree 不自动扩展,Swing 嵌入到 SWT
【发布时间】:2017-06-28 14:06:28
【问题描述】:

所以我正在使用嵌入到 SWT 中的 Swing 组件。

这是我的问题的简化版本,基本上我有两个 Panel 对象 (panelA, panelB) 和一些 Swing 组件,嵌入在我的 Shell 中。我想在panelB 上添加一个on/off 选项,这样做除了我的JTree 来填充整个Shell 而panelBoff,但是它没有...

我发现的唯一方法是重新创建组件,但我觉得这不是做事的好方法。 (用于关闭我正在使用的组件setVisible()) 当panelB关闭时,让JTree组件填充空间的任何想法?

import javax.swing.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;


public class testCW {

public static void main(String[] args) {

  Display display = new Display();
  Shell shell = new Shell(display);
  shell.setText("Test");
  shell.setLayout(new FillLayout());


  Composite compositeA = new Composite(shell,SWT.EMBEDDED);
  java.awt.Frame frameA = SWT_AWT.new_Frame(compositeA);
  java.awt.Panel panelA = new java.awt.Panel(new java.awt.BorderLayout());
  frameA.add(panelA);
  JScrollPane scrollPaneA = new JScrollPane(new JTree());
  panelA.add(scrollPaneA);


  Composite compositeB = new Composite(shell,SWT.EMBEDDED);
  java.awt.Frame frameB = SWT_AWT.new_Frame(compositeB);
  java.awt.Panel panelB = new java.awt.Panel(new java.awt.BorderLayout());
  frameB.add(panelB);
  JButton buttonB = new JButton("Button");
  panelB.add(buttonB);



  shell.open();
  while (!shell.isDisposed()) {
    if (!display.readAndDispatch())
    display.sleep();
    // test 1 : hide panelB or compositeB? -> run -> JTree extends well?
    // test 2 : hide panelB or compositeB? -> print panelB(compositeB)
    // -> run  -> displays well ?
    // panelB.setVisible(false);
    // compositeB.dispose();     //TEST
  }
  display.dispose();

}
}

【问题讨论】:

    标签: java swing swt swt-awt


    【解决方案1】:

    您可以添加一个包含 compositeAcompositeB 的父组合,如下所示:

    final Composite composite = new Composite( shell, SWT.NONE);
    composite.setLayout(new GridLayout( 2,false) );
    

    然后将您的复合材料添加到该父级,例如:

    Composite compositeA = new Composite(composite, SWT.EMBEDDED);
    GridData filldataA = new GridData(GridData.FILL_BOTH);
    compositeA.setLayoutData(filldataA);
    

    请注意,我最初为compositeA 添加了GridData 以占据整个空间。

    将选择侦听器添加到工具栏上的 SWT.PUSH 按钮。 可以说 - 您的 SWT.PUSH 按钮是 swtButton。 然后向它添加一个选择侦听器,如下所示:

    swtButton.addSelectionListener(new SelectionAdapter()
    {
        private boolean expandTree = true;
        @Override
        public void widgetSelected(SelectionEvent e) 
        {
            Layout lo = composite.getLayout();
            GridLayout glo = (GridLayout)lo;
            if ( expandTree )
            {
                glo.makeColumnsEqualWidth = true;
                expandTree = false;
            }
            else
            {
                glo.makeColumnsEqualWidth = false;
                expandTree = true;
            }
    
            composite.layout();
        }
    });
    

    基本上,您的动作侦听器中有一个布尔值 - expandTree - 在按钮点击之间切换,取决于真或假 - 使父复合在使列等宽真或假之间切换。

    IMO 你不需要compositeB

    【讨论】:

    • 感谢它扩展得很好,但是我应该在 hide 按钮上添加什么?在我正在处理的应用程序上,我将有一个外部按钮,该按钮将打开/关闭 buttonB,因此JTree 组件可以填满整个空间。
    • 如果你在 buttonB 上隐藏/设置可见(false),你怎么能再次打开它,即按下一个不可见的按钮?你能展示你正在谈论的代码吗?
    • 也许你可以有一个复选框而不是一个按钮。选中时展开树,选中时折叠树
    • 在我的真实应用程序(RCP 应用程序)上,我有一个带有按钮on/off 的工具栏,这里buttonB 只是添加到我的panelB 的随机摆动组件作为示例,但我没有将其用作 one/off 按钮。
    • 开/关是指切换按钮吗?切换按钮与带有 SWT.PUSH 的按钮不同
    【解决方案2】:

    您必须坚持使用 FillLayout 吗?每当您想在 SWT 中隐藏组件时,建议使用 GridLayout。这是一个如何做的例子:http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/ExcludeawidgetfromaGridLayout.htm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 2011-08-05
      • 2011-10-31
      • 1970-01-01
      • 2014-09-07
      相关资源
      最近更新 更多