*新标题:JButton数组范围(原来是:用按钮名称更改按钮的颜色)



如何更改正确按钮的颜色?这是一个小型应用程序,这个应用程序有5个来自数组的按钮。(名称为a、b、c、d、e)

当我在Jtext字段中键入数字时,按钮的外观必须改变(更改颜色)。

我为每个按钮添加了一个名称:

knop = new JButton(Titel[i]);
            knop.setName(tel[i]);

在这里我得到了文本:

public void actionPerformed(ActionEvent e) {
        String invoer = antwoord.getText();

        try 
        {
            int welke = Integer.parseInt(invoer);
            if  (welke-1 >0 && welke-1<5) 
            { 
                vraag.setText("Goeie keus!");
                if (welke == 1){ 
                    knop.setBackground(Color.BLUE);
                }
                knop.setBackground(Color.red);
            }

但现在它只将最后一个按钮更改为红色,这是在数组中创建的。

那么问题是,我可以按名称选择按钮吗?因此,如果(input=1)将按钮1更改为绿色。而不是仅按钮5。

我已经尝试过解决gile的问题,但我无法让它发挥作用:

每次我都会得到一个:"AWT-EventQueue-0"java.lang.NullPointerException"

package kiesknop;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
//public class Paneel extends JApplet
public class Paneel extends JFrame
{
private JPanel paneel;
private JButton knop;
public  JTextField antwoord;
private JLabel vraag;
public JButton[] knops;
public Paneel() {
    int [][] numButtons = new int [5][4];
    numButtons[0][0] = 50;
    numButtons[0][1] = 10;
    numButtons[0][2] = 10;
    numButtons[0][3] = 10;
    numButtons[1][0] = 100;
    numButtons[1][1] = 10;
    numButtons[1][2] = 30;
    numButtons[1][3] = 30;
    numButtons[2][0] = 200;
    numButtons[2][1] = 10;
    numButtons[2][2] = 50;
    numButtons[2][3] = 50;
    numButtons[3][0] = 300;
    numButtons[3][1] = 10;
    numButtons[3][2] = 100;
    numButtons[3][3] = 100;
    numButtons[4][0] = 500;
    numButtons[4][1] = 10;
    numButtons[4][2] = 200;
    numButtons[4][3] = 200;
    String [] Titel = new String [5];
    Titel [0] = "*";
    Titel [1] = "**";
    Titel [2] = "***";
    Titel [3] = "****";
    Titel [4] = "*****";
    String [] tel = new String [5];
    tel [0] = "a";
    tel [1] = "b";
    tel [2] = "c";
    tel [3] = "d";
    tel [4] = "e";
paneel = new JPanel();
JButton[] knops = new JButton[5];
for (int i = 0; i < 5; i++)
        {
            knops[i] = new JButton(Titel[i]);
            knops[i].setName (tel[i]);
            knops[i].setBounds(numButtons[i][0],numButtons[i][1], numButtons[i][2], numButtons[i][3]);
            knops[i].addActionListener(new KnopHandler());
        }
for (int i = 0; i < 5; i++)
{
    paneel.add(knops[i]);
}

vraag = new JLabel("Welke knop grootte vind je het mooist?");
vraag.setBounds(100, 400, 250, 20);
antwoord = new JTextField(20);
antwoord.setBounds(500, 400, 100, 20);
antwoord.setEditable(true);
antwoord.addActionListener(new AntwoordHandler());
paneel.add (vraag);
paneel.add (antwoord);
setContentPane (paneel);
    }
public class KnopHandler implements ActionListener  {
    public void actionPerformed(ActionEvent e) {
        JButton o = (JButton)e.getSource();
        String Text = o.getText();
        String name = o.getName();
        String Label =o.getLabel();
        System.out.println("knop gedrukt");
        System.out.println(Text);
        System.out.println(name);
        System.out.println(Label);  
    }
}
class AntwoordHandler  implements ActionListener  {
    public void actionPerformed(ActionEvent e) {
        String invoer = antwoord.getText();

        try 
        {
            int welke = Integer.parseInt(invoer);
            if  (welke >0 && welke<5) 
            { 
                vraag.setText("Goeie keus!");
                if(welke == 1)// knops[welke].setBackground(Color.BLUE);
                System.out.println(knops[1]);
                if(welke == 2) knops[welke].setBackground(Color.BLUE);
                if(welke == 3) knops[welke].setBackground(Color.BLUE);
                if(welke == 4) knops[welke].setBackground(Color.BLUE);
                if(welke == 5) knops[welke].setBackground(Color.BLUE);
                }
            else vraag.setText("Geen geldige invoer!");
            }
            catch( NumberFormatException nfe)
            {
                if( invoer.equals("")) vraag.setText("Niets ingevuld!");
                    else 
                vraag.setText("Alleen nummers invoeren!");
            }
        }
    }

public static void main (String arg[])
{
JFrame frame = new Paneel();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
frame.setVisible(true);
frame.setSize(900, 500);

}
}

我做错了什么?

您可以将按钮放在阵列中

JButton[] knops = new JButton[5];
...
knops[i] = new JButton(Titel[i]);
...

然后在用户输入数字后设置背景:

if (welke == 1){ 
    knops[welke].setBackground(Color.GREEN);
}

您的标题与给定的示例不匹配:您要求获得一个具有字符串名称的按钮引用,但您试图将名称解析为整数

然而,如果我正确理解你的要求:我可以想到两个选项:

  1. 遍历按钮数组中的每个按钮,并将它们的名称与目标名称进行比较:您可以获得调用button.getName()的组件(JButton)的名称。

  2. 创建一个HashMap<key, value>:HashMap<String, JButton>,将按钮映射到它们的名称,并使用它来获取Action Event上的组件,而不是使用每次都需要遍历才能获得具有匹配名称的目标按钮的数组。

      HashMap<String, JButton>buttomMap = new HashMap<>();
      buttonMap.put("kicker", kickerButton); // kickButton is a button
      //// Then in actionPerformed() function
      JButton button = buttonMap.get("kicker");
      button.setBackground(Color.BLUE);
    

最新更新