gpt4 book ai didi

java - 我应该扩展 Swing JCheckBox 吗?

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

我有一个带有多个 JCheckBox 的 Swing 应用程序。每个 JCheckBox 对应于我程序中其他地方的 Foo 类型的另一个对象。对于 Foo 类型的每个对象,我将提供其中一个 JCheckBox 供用户单击(它告诉 Foo 对象是否应在 UI 上显示)。

我当前正在做的是使用 JCheckBox 上的 name 属性作为对 Foo 对象的字符串“name”的引用。我觉得一个更干净的解决方案是扩展 JCheckBox 向其添加一个额外的字段,以便 JCheckBox 可以通过简单地跟踪它附加到哪个 Foo 对象存储对其的引用。想法?人们是否经常扩展 Swing 组件,以便可以将 Controller / View 中的部件链接回模型?我会遇到一些可怕的陷阱吗?

最佳答案

如果没有额外的细节,很难了解这个特定示例的全貌。您也许能够使用操作来完成此任务。请参阅How to Use Actions更多细节。这是一个例子:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.*;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

public class CheckBoxDemo {

static class Foo {
private boolean visible;
private String name;

public Foo(String name) {
this.name = name;
}

public boolean isVisible() {
return visible;
}

public void setVisible(boolean visible) {
this.visible = visible;
System.out.println(getName() + ".setVisible:" + visible);
}

public String getName() {
return name;
}
}

static class FooAction extends AbstractAction {
private Foo foo;

public FooAction(Foo foo) {
super(foo.getName());
this.foo = foo;
}

@Override
public void actionPerformed(ActionEvent e) {
JCheckBox checkBox = (JCheckBox) e.getSource();
foo.setVisible(checkBox.isSelected());
}
}

private static void createAndShowGUI() {
List<Foo> fooList = new ArrayList<Foo>();
fooList.add(new Foo("Foo1"));
fooList.add(new Foo("Foo2"));
fooList.add(new Foo("Foo3"));

JPanel content = new JPanel(new BorderLayout());

JPanel fooPanel = new JPanel();
for (Foo foo : fooList) {
fooPanel.add(new JCheckBox(new FooAction(foo)));
}

content.add(fooPanel, BorderLayout.NORTH);

final JTextArea textArea = new JTextArea();
textArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setPreferredSize(new Dimension(200, 200));
content.add(scrollPane, BorderLayout.CENTER);

JFrame frame = new JFrame("CheckBoxDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(content);

frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);

// just for brevity of example
System.setOut(new PrintStream(new OutputStream() {
@Override
public void write(int b) throws IOException {
textArea.append(String.valueOf((char) b));
}
}));
}

public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}

关于java - 我应该扩展 Swing JCheckBox 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12327551/

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