У вас есть пара проблем с кодом, который вы разместили, но они обычно сводятся к тому, чтобы понять, что является членом класса (статический) и что является членом экземпляра.
Для начала, ваш массив buttons
существует только внутри вашего основного метода и не может быть доступен для changeColors()
. В том же духе, поскольку changeColors()
является методом экземпляра, setBackground()
необходимо вызывать непосредственно на кнопке в вашем массиве. как написано, вы устанавливаете цвет для одной кнопки 3 раза.
Кроме того, логика в changeColors()
неправильно вращает индекс currentColor
. Вам нужно как увеличить счетчик, так и обеспечить обтекание по длине цветового массива. Если массивы имеют одинаковый размер, вам нужно убедиться, что есть дополнительное дополнение, чтобы сделать цикл цветов.
private static void changeColors( ) {
for (int i=0;i<buttons.length;i++){
buttons[i].setBackground(COLORS[currentColor]);
currentColor = nextColor(currentColor);
}
if (buttons.length == COLORS.length) {
currentColor = nextColor(currentColor);
}
}
private static int nextColor(int currentColor) {
return (currentColor+1)% COLORS.length;
}
Изменить для нового кода:
Я не уверен, почему вы переписали nextColor()
, поскольку то, что я опубликовал, сработало. Но в целом я чувствую, что вы сталкиваетесь с проблемами, потому что ваш код плохо разбит на части для задач, которые вы пытаетесь достичь. У вас есть код, связанный с конкретным экземпляром кнопки, и код, связанный с управлением смешиванием всех кнопок.
В следующей реализации вопрос о том, сколько раз была нажата кнопка, явно самодостаточен в классе кнопок. Затем каждое нажатие кнопки также вызывает один метод на панели-владельце. Этот метод знает, сколько кнопок и цвет первой кнопки. И каждая последующая кнопка будет содержать следующий цвет в списке, при необходимости оборачиваясь.
public class RotateButtons extends JPanel {
private static final Color[] COLORS = { Color.ORANGE, Color.WHITE, Color.GREEN };
private static final int BUTTON_COUNT = 3;
private JButton[] _buttons;
private int _currentColor = 0;
public static void main(String[] args)
{
JFrame frame = new JFrame("JFrame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new RotateButtons());
frame.setSize(500, 500);
frame.setVisible(true);
}
public RotateButtons()
{
_buttons = new JButton[BUTTON_COUNT];
for (int i = 0; i < _buttons.length; i++) {
_buttons[i] = new CountButton();
add(_buttons[i]);
}
}
private void rotateButtons()
{
for (JButton button : _buttons) {
button.setBackground(COLORS[_currentColor]);
_currentColor = nextColor(_currentColor);
}
if (_buttons.length == COLORS.length) {
_currentColor = nextColor(_currentColor);
}
}
private int nextColor(int currentColor)
{
return (currentColor + 1) % COLORS.length;
}
private class CountButton extends JButton {
private int _count = 0;
public CountButton()
{
setBackground(Color.YELLOW);
setText("Pick ME");
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0)
{
_count++;
setText("# of clicks = " + _count);
rotateButtons();
}
});
}
}
}
2-е редактирование:
Показывает только изменения в смещении _currentColor
на необходимую сумму при первом клике.
public class RotateButtons extends JPanel {
...
private boolean _firstClick = true;
...
private void rotateButtons(CountButton source)
{
if (_firstClick) {
_firstClick = false;
boolean foundSource = false;
for (int i = 0; i < _buttons.length; i++) {
if (foundSource) {
_currentColor = nextColor(_currentColor);
} else {
foundSource = _buttons[i] == source;
}
}
}
...
}
private class CountButton extends JButton {
...
public CountButton()
{
...
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0)
{
...
rotateButtons(CountButton.this);
}
});
}
}