如何为多个 Jbutton 编写动作监听器

Posted

技术标签:

【中文标题】如何为多个 Jbutton 编写动作监听器【英文标题】:How to write an action listener for multiple Jbuttons 【发布时间】:2021-12-18 14:56:57 【问题描述】:
    //Created a composite with label and text field
    Label label = new Label(composite, SWT.NONE);
    label.setText("Test:");        
    labelTxt = new Text(composite, SWT.BORDER);
    labelTxt.setText("56");         //value here might be empty or might be already set with 
                                  // any value from demo image
    
    labelTxt.addMouseListener(new MouseListener() 
        @Override
        public void mouseUp(MouseEvent arg0) 
        

        @Override
        public void mouseDown(MouseEvent arg0) 
        

        @Override
        public void mouseDoubleClick(MouseEvent arg0) 
            System.out.println(" mouse double clicked");
            // I created a pop up on double click with buttons here. 
            ///The pop up image is attached for reference
        
    );  

演示图片:

现在我需要的是,如果我单击弹出窗口中的任何按钮,则按钮值应保存到“labelTxt”。 即,如果我单击按钮 R6,则 R6 应保存在 labelTxt 中。

【问题讨论】:

这看起来像 SWT 代码 - 不使用 JButton 之类的东西 - 不要尝试混合 SWT 和 AWT/Swing,它不起作用。 我并不是想把代码混合起来实际弹出它很好。我无法将文本设置为必填字段,因为按钮和文本字段都位于不同的外壳上。 它们在不同的 shell 中没有区别,SWT 和 AWT/Swing 具有不同的事件循环,因此很难让代码同时使用它们来正常工作。为了让它工作,你需要使用SWT_AWT.new_Frame - 你在这样做吗? 是的,我使用过类似“java.awt.Frame fileFrame = SWT_AWT.new_Frame(treeComp);” 但是你为什么要使用 AWT/Swing 呢?在 SWT 中似乎没有任何事情不能轻松完成。尝试从 AWT 回调中设置 SWT Labels 的值似乎有问题。 【参考方案1】:

此代码实现了您在 SWT 中显示的弹出窗口并设置 labelTxt 字段。由于都是 SWT,因此 AWT/SWT 交互没有问题。它假定labelTxt 是包含类中的一个字段。

代码使用 JFace GridDataFactoryGridLayoutFactory,但如果需要,可以仅转换为 SWT。它还使用var,因此需要 Java 10 或更高版本(同样可以更改为 Java 8)。

private void openPopup(final Shell parentShell)

  final var shell = new Shell(parentShell, SWT.ON_TOP | SWT.TOOL);

  shell.setLayout(new GridLayout());

  // Composite for the main set of buttons

  final var body = new Composite(shell, SWT.NONE);

  GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).grab(true, false).applyTo(body);

  GridLayoutFactory.swtDefaults().numColumns(4).equalWidth(true).margins(15, 5).spacing(1, 1).applyTo(body);

  new Label(body, SWT.LEAD);
  addButton(body, "RR");
  addButton(body, "3");
  new Label(body, SWT.LEAD);

  addButton(body, "7");
  addButton(body, "5");
  addButton(body, "R6");
  addButton(body, "1");

  addButton(body, "74");
  addButton(body, "we");
  addButton(body, "FL");
  addButton(body, "23");

  addButton(body, "R4");
  addButton(body, "R3");
  addButton(body, "R2");
  addButton(body, "R1");

  // Horizontal spacer

  final var spacer1 = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
  GridDataFactory.fillDefaults().applyTo(spacer1);

  // Right aligned close button

  final var closeButton = new Button(shell, SWT.PUSH);
  closeButton.setText("Cancel");

  closeButton.addListener(SWT.Selection, event -> shell.close());

  GridDataFactory.fillDefaults().align(SWT.END, SWT.CENTER).grab(true, false).applyTo(closeButton);

  // Layout and open shell

  shell.layout();
  shell.pack();

  shell.open();

  // Block until closed

  final var display  = shell.getDisplay();

  while (!shell.isDisposed())
   
     if (!display.readAndDispatch())
       display.sleep();
   

  display.update();



private static void addButton(final Composite body, final String text)

  final var button = new Button(body, SWT.PUSH | SWT.FLAT);   // Flat style is optional here

  button.setText(text);

  GridDataFactory.fillDefaults().hint(75, 40).applyTo(button); // Adjust hints to change button size to suit

  button.addListener(SWT.Selection, event ->
    
      labelTxt.setText(text);

      button.getShell().close();
    );

【讨论】:

以上是关于如何为多个 Jbutton 编写动作监听器的主要内容,如果未能解决你的问题,请参考以下文章

如何为android数据绑定点击监听器编写proguard规则?

如何为列表视图适配器中的开关添加点击监听器

从 JButton 中删除一个 ActionListener

编码下一个和上一个按钮

使用 for 循环时向 JButton 添加操作

作为动作监听器的一部分,我如何调用输入到对话框中的信息?