【问题标题】:Common property for JButtonsJButtons 的公共属性
【发布时间】:2014-08-11 06:12:39
【问题描述】:

我是摇摆核心功能的新手。我有网页设计经验。 id 表示唯一性,class 表示共性。

<div class="x" id="div1"></div>
<div class="x" id="div2"></div>

如果我想为所有 div 设置属性,我将使用 x 类。

.x
{
} or via javascript or jquery

如果我想访问单个 div,我将使用 id。因为它是独一无二的。

Java Swing 按钮中也有同样的方法吗?假设我有二维的 jbuttons 数组。

目前尝试过

我找到了putClientPropertygetClientproperty。它设置并返回 id。

btnName.putClientproperty('id',value);

我的第一个问题:
设置唯一ID的正确方法是什么?还有其他方法吗?

JButton[][] btns = new JButton[5][5];
for(int i=0; i<5; i++)
{
 for(int j=0;j<5;j++)
 {
   btns[i][j] = new JButton("Button"+i+j);
 }
}

上面的代码将创建 25 个带有名称的按钮。

我的第二个问题: 我不知道它。如何设置类以便我可以使用单行代码启用或禁用它们?我的意思是 All the 25 buttons has a common class let it be tiles

JButton.find('tiles').setEnabled(false);

在java中有类似的东西吗?我知道迭代并做到这一点的方法。但我想减少行数,函数调用。这就是我发布这个问题的原因。请告诉我

【问题讨论】:

  • 您可以使用JButton#setName(和getName)和或JButton#setActionCommand(和getActionName)这可能是用于唯一标识按钮的典型机制......显然,它来了取决于您创建的唯一名称;)
  • “所以有唯一性的 id 和通用性的类。同样地,java swing 按钮中是否有任何东西?” 不是你问的意思。 “设置Unique id的方法正确吗?还有其他方法吗?”不理想,不。但是,如果您 “拥有 2D 数组”,则很容易对其进行迭代。也许您正在寻找Action 或它们的集合。 "我的第二个问题:" 这里的每个主题都应该关注一个问题,并希望至少有一个好的和被接受的答案。但我什至不理解“禁用课程”的概念。
  • btnName 不是已经是标识符了吗? ;-)
  • @MadProgrammer 所以名称和命令是其他独特的方式。您能否介绍一下常用名称?[即类] btnclas.setEnabled(false) 将所有 btns 设置为禁用。有可能吗??
  • @AndrewThompson 是的,我会选择Action 来...(我仍在努力解决这个问题)

标签: java arrays swing jbutton


【解决方案1】:

在您的代码示例中...

JButton[][] btns = new JButton[5][5];
for(int i=0; i<5; i++)
{
    for(int j=0;j<5;j++)
    {
        btns[i][j] = new JButton("Button"+i+j);
    }
}

你说...

上面的代码将创建 25 个带有名称的按钮。

这不完全正确,它创建了 25 个带有 Button"+i+j 文本的按钮,这听起来像是挑剔,但它很重要,因为按钮没有名称,到目前为止,唯一的区分它们的是屏幕上显示的文本。

多个按钮可能具有相同的文本,因此除了它们各自的(内存)引用之外,这并不是真正设置唯一性。

“唯一 ID” 也是模棱两可的。您创建的每个按钮都是独一无二的,但它可能具有相似的属性,例如 nametextactionCommand,因此唯一使它独一无二的是它在内存中的位置。

如果这就是你的意思,那么是的,这将是开始......

我的第二个问题:我不知道。如何设置类以便我可以使用单行代码启用或禁用它们?我的意思是所有 25 个按钮都有一个共同的类,让它成为瓷砖

从 API 的角度来看,没有。您需要迭代按钮并单独管理每个按钮。不过,话虽如此,您还是可以利用Action API。

Action 通常是一个独立的工作单元,可以轻松应用于多个按钮、菜单项和键绑定...但在您的情况下,我们只对操纵它感兴趣的是 @987654329 @state,例如,以...开头。

public class GroupAction extends AbstractAction {
    @Override
    public void actionPerformed(ActionEvent evt) {
    }
}

然后你可以做类似...

GroupAction groupAction = new GroupAction();
JButton[][] btns = new JButton[5][5];
for(int i=0; i<5; i++)
{
    for(int j=0;j<5;j++)
    {
        btns[i][j] = new JButton(groupAction);
        // This is important as the button will want
        // to use the Action properties to configure itself
        btns[i][j].setText("Button"+i+j);
    }
}

然后你可以使用类似...

groupAction.setEnabled(false);

使用GroupAction 的相同实例禁用所有按钮

查看How to Use Actions了解更多详情

【讨论】:

  • 谢谢 :) 你真的是一个 MAdProgrammer :) 会检查一下。
  • 不同意 JButton#setName/setActionCommand,不是在谈论数组内的坐标,x.y 仍然存在。问题-->这个元素真正放在哪里,你可以多玩这个id,当然不要攻击你的人:-)你很清楚
  • @mKorbel 专注于细节而不是实施 ;) - 你说应该假设放置是正确的,我同意。个人更愿意使用actionCommand,但这会将我们引向Action API,它可以被认为是这个想法的扩展(多个按钮可以有相同的actionCommand或相同的Action
【解决方案2】:

您始终可以使用您的 id 制作 Object -> Integer 或 String 的映射。例如:

Map<JButton, Integer> buttonToIdMap = new TreeMap<JButton, Integer>();

并将您的 ID 放入地图中:

buttonToIdMap.put(button, 123);

当你需要一个按钮的 ID 时:

int id = buttonToIdMap.get(button);

【讨论】:

  • 这确实应该是一个评论,在这个阶段(问题本身的混乱)。你现在似乎有足够的代表了。要制作 cmets,请使用它。
  • @AndrewThompson 你在说什么?这样就解决了问题。
  • 这让我了解了带有键和值的地图。我可以在代码的第一行中使用数组名称而不是 JButton 吗?上课呢??有什么想法吗?
  • @SilviuBurcea “这解决了问题。”我仍然不确定问题是什么(确切地说),但似乎地图不再有用了处理对象集合而不是数组。
  • @user3801433 您可以通过用于在地图中存储按钮的键来识别按钮。另一种选择是扩展一个 JButton(MyButton),它将持有一个唯一的键和实际的 JButton。您还可以更改按钮的呈现方式或保持原样。
猜你喜欢
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 2013-02-13
  • 2012-09-03
  • 2011-02-26
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多