【问题标题】:How to make String value to call specific existed JButton variable name in java?java - 如何使字符串值在java中调用特定的现有JButton变量名?
【发布时间】:2016-04-10 13:26:59
【问题描述】:

所以,我知道有这个:

int number = Integer.parseInt("5");
String numtxt = Integer.toString(12);
double number = Double.parseDouble("4.5");
String numbertxt = Double.toString(8.2);
String letter = Character.toString('B');
char letter = "stringText".charAt(0);

so on...

但是我不知道如何使 String 值动态调用现有的 JButton 变量名;有可能吗?

假设我有 4 个 JButton,分别称为 btn1、btn2、btn3 和 btnFillNumber;

我创建了一个名为 buttonName 的字符串;

package testing;

public class Testing extends javax.swing.JFrame {

String buttonName;
int num;

public Testing() {
    initComponents();
}

@SuppressWarnings("unchecked")
// Generated Code <<<-----

private void btnFillNumberActionPerformed(java.awt.event.ActionEvent evt) {                                              
    for(num = 1; num <= 3; num++){
        buttonName = "btn" + Integer.toString(num);
        JButton.parseJButton(buttonName).setText(num);
    }
}                                             

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    // Look and feel stteing code (optional) <<<-----

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Testing().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
private javax.swing.JButton btn1;
private javax.swing.JButton btn2;
private javax.swing.JButton btn3;
private javax.swing.JButton btnFillNumber;
// End of variables declaration                   
}

我知道没有JButton.parseJButton(),我只是不想做复杂的解释,我只是想从String转换为动态调用JButton的变量名。

看这个:

    for(num = 1; num <= 3; num++){
        buttonName = "btn" + Integer.toString(num);
        JButton.parseJButton(buttonName).setText(num);
    }

我想用一个字符串来做一个循环

  • 一个固定的字符串值 (btn) 和
  • 在它之后增加数字 (1, 2, 3...) 和
  • 利用调用 JButton。

我可以简单地做到这一点,但如果我得到 25 或更多怎么办?所以我想要一个循环......

btn1.setText("1");
btn2.setText("2");
btn3.setText("3");

请注意,这些 JButton 的值在某些用途中不一定是递增的。

输出:

我的真实发展:

附:我使用在 NetBeans 设计中制作 JFrame(只需单击并拖动调色板窗口中的对象,如 JPanel、JButton 等,因此除了制作自己的逻辑方法外,我不会手动键入代码;而且我无法编辑代码源视图中的灰色背景,由设计视图自动创建,但在设计视图本身中。如果您有提示和指南,我会很乐意)。

【问题讨论】:

  • 如果我理解这一点,那么一种方法可能是将按钮存储在Map&lt;String,JButton&gt; 中。之后您可以通过map.get("btn1") 访问它们。
  • 感谢您的快速回复,也许我会去看看.. 还在学习 Java。 :D
  • @Jan Jeremy 我的问题是,如果每个 JButton 都有静态值集或 JButton 的值可以在运行时更改,那么这个问题可以解决
  • @mKorbel 你是什么意思?你的意思是btn1-btn3的值? (可以通过 setText 更改)。不,它们不是静态的,它们可以分配给不同的值。

标签: java swing jbutton string-conversion


【解决方案1】:

使用地图:

private Map<String,JButton> buttonMap = new HashMap<String,JButton>();

在你的构造函数中添加你的按钮:

buttonMap.add("btn1", btn1);
buttonMap.add("btn2", btn2);
buttonMap.add("btn3", btn3);
buttonMap.add("btn4", btn4);

在你的行动中,Listener / Loop 不管做什么:

String buttonName = "btn1"; //should be parameter or whatever
JButton button = buttonMap.get(buttonName);

您也可以设置一个 JButton 数组:

JButton[] buttons = new JButton[4];

button[0] = new JButton(); //btn1
button[1] = new JButton(); //btn2
button[2] = new JButton(); //btn3
button[3] = new JButton(); //btn4

然后访问它

JButton but = button[Integer.parseInt(buttonString)-1];

或者利用向 UI 元素添加自定义属性的可能性(为此您需要一个 JComponent)

getContentPane().putClientProperty("btn1", btn1);

然后再检索 whith

JButton but = (JButton)getContentPane().getClientProperty("btn1");

【讨论】:

  • (Hash)Map 没有更好地使用 util.List 的内部索引,那么所有额外的参数都可以存储(取决于索引)在 get/putClientProperty 和/或使用 Swing Action
  • 使用地图,您可以按名称访问项目 - 使用列表,您只能按索引访问。这个问题的措辞很明确,是按名称访问,因此地图提供了最佳结果。
  • 您可以在 按钮 上使用 get/putClientProperty。如果他们在地图中,仍然可以做到这一点。还是您想使用将添加按钮的JPanel作为“地图”来存储值?
  • 是的,同意,完全可以,但是 util.List 是更好的数组,你必须在 (Hash)Map 中分别保存索引(可以从任何地方需要):-)跨度>
【解决方案2】:

我同意凯文的评论。最好的具体Map&lt;K,V&gt; 类可能是Hashtable&lt;K,V&gt;。您甚至不需要创建按钮名称,只要将它们都编号(如果btnFillNumber 可以是0)与它关联一个整数。

Hashtable<Integer,JButton> buttonTable = new Hashtable<>();

// Fill buttonTable with buttons

JButton button = buttonTable.get(num);

if (button != null) {
    // Do something with button
}

由于自动装箱,您不需要创建Integer 对象来查询哈希表,num 可以是int 原语。

【讨论】:

猜你喜欢
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
相关资源
最近更新 更多