Проблема с реализацией Java GUI - PullRequest
0 голосов
/ 10 февраля 2011

У меня проблема с кодом, который я сейчас пытаюсь запустить - я пытаюсь создать 3 кнопки, поместить их в графический интерфейс, а затем изменить цвет первых кнопок на оранжевый, а кнопки рядом с этим цветомизменить на белый и зеленый.Каждый последующий щелчок приведет к тому, что цвета переместятся на одну кнопку вправо.Пока что мой код выглядит следующим образом: он пропускает цвета местами и ведет себя совсем не так, как я ожидал.Может ли кто-нибудь предложить некоторую помощь / руководство, пожалуйста?

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class ButtonJava extends JButton implements ActionListener  {
  private int currentColor=-1;
  private int clicks=0;
  private static final Color[] COLORS = {
    Color.ORANGE,
    Color.WHITE,
    Color.GREEN };
  private static ButtonJava[] buttons;

  public ButtonJava( ){
    setBackground( Color.YELLOW );
    setText( "Pick ME" );
    this.addActionListener( this );
  }

  public static void main(String[] args) {
    JFrame frame = new JFrame ("JFrame");
    JPanel panel = new JPanel( );
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
    buttons = new ButtonJava[3];
    for(int i = 0;i<buttons.length ; i++){
      buttons[i] = new ButtonJava(); 
      panel.add(buttons[i]);
    }
    frame.getContentPane( ).add( panel );
    frame.setSize( 500, 500);
    frame.setVisible( true );
  }

  private void updateButton() {
     clicks++;
    changeColors();
//    setText( );
  }

private void changeColors( ) {
  for (int i=buttons.length-1;i>=0;i--){
    buttons[i].currentColor = nextColor(currentColor);
    buttons[i].setBackground(COLORS[buttons[i].currentColor]);
    buttons[i].setText(("# of clicks = " + buttons[i].getClicks() ) );
  }
}

private Integer getClicks() {
 return clicks;
}

private int nextColor( int curCol ) {
  final int colLen = COLORS.length;
  curCol--;
  curCol = (colLen + curCol % colLen) % colLen;
  return curCol;
}

private void firstClick( ActionEvent event ) {
  int curCol = 0;
  for (int i=buttons.length-1;i>=0;i--){
    if ( buttons[i] == event.getSource() ) {
      buttons[i].currentColor = curCol;
      curCol++;
      currentColor++;
    }
  }}

  @Override
  public void actionPerformed( ActionEvent event ) {
    if ( -1 == currentColor ) {
      firstClick( event );
    }
    updateButton( );   
  }


}

Большое спасибо за помощь:)

Ответы [ 3 ]

3 голосов
/ 10 февраля 2011

У вас есть пара проблем с кодом, который вы разместили, но они обычно сводятся к тому, чтобы понять, что является членом класса (статический) и что является членом экземпляра.

Для начала, ваш массив 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);
        }
      });
    }
  }
1 голос
/ 10 февраля 2011

Если я понимаю, чего вы хотите достичь, я думаю изменить currentColor %= 2 на ++currentColor и setBackground(COLORS[currentColor]); на buttons[i].setBackground(COLORS[(i + currentColor) % 3]);.Таким образом, ваши цвета должны вращаться вокруг кнопок при каждом нажатии одной из них.

РЕДАКТИРОВАТЬ: вероятно также стоит вызвать changeColors из main для инициализации цветов кнопок.И, как отмечает @unholysampler, ваш массив buttons является локальным для main и должен (например) быть реорганизован как статическая переменная-член, а changeColors стать статическим методом.

1 голос
/ 10 февраля 2011

Одна вещь, которую я заметил, это то, что вы используете currentColor для назначения цвета, но currentColor инициализируется на 0 , и единственная манипуляция - currentColor %= 2 не меняет его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...