如何为多个 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 GridDataFactory
和 GridLayoutFactory
,但如果需要,可以仅转换为 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规则?