2

このようなほぼ同一のブロックを含むコードは、私をうんざりさせます。さらに、1,000 行のコードがあれば、その半分で十分です。確かに、ループを作成してすべてを実現し、それほど洗練されておらず頭の悪いコードを持たないようにする方法はあります。

オフハンドでは、私が削減しようとしているのと同じくらい多くのコードを追加するように思われます: 5 つのボタンを作成するためのループ、ボタンのラベルの配列、背景の配列... 多分もっと。それが受け入れられることがわかったとしても、リスナーを処理するためにループを作成するにはどうすればよいでしょうか? メソッドの配列を持つことはできませんね。そのようなループには . を含める必要があると思いますswitch。はい?より良い解決策を探したくない場合は、おそらくそうするでしょう。だから私は尋ねています...

ボタンのグループ全体をリッスンし、押されたボタンに基づいてアクションを実行するコードはどのようなものになるでしょうか? 単一のリスナーをどのコンポーネントに割り当てますか? そしてどうやって?

(その質問への答えは、コードの繰り返しの性質よりもさらにうんざりさせる可能性があります.その方法をすでに知っていて、そもそも尋ねる必要さえなかったことに気付いた場合、しかし私は.とにかく聞いてください.私は、脳がちょうど出たいと思っている今日のポイントの1つにいます.)

  private void makeScoremasterBonuses(){
    pnlBonuses = new JPanel(new GridLayout(1, 6));
    pnlBonuses.setSize(6,1);

    JButton t1 = (new JButton("3W"));
    t1.setToolTipText("This is a triple-word cell.");
    t1.setBackground(TRIPLE_WORD);
    t1.setHorizontalAlignment(JButton.CENTER);
    t1.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        Highlighter.shadeSymmetric(currentCell,TRIPLE_WORD);
      }});

    JButton t2 = (new JButton("3L"));
    t2.setToolTipText("This is a triple-letter cell");
    t2.setBackground(TRIPLE_LETTER);
    t2.setHorizontalAlignment(JButton.CENTER);
    t2.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        Highlighter.shadeSymmetric(currentCell,TRIPLE_LETTER);
      }});

    JButton t3 = (new JButton("2W"));
    t3.setToolTipText("This is a double-word cell");
    t3.setBackground(DOUBLE_WORD);
    t3.setHorizontalAlignment(JButton.CENTER);
    t3.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        Highlighter.shadeSymmetric(currentCell,DOUBLE_WORD);
      }});

    JButton t4 = (new JButton("2L"));
    t4.setToolTipText("This is a double-letter cell");
    t4.setBackground(DOUBLE_LETTER);
    t4.setHorizontalAlignment(JButton.CENTER);
    t4.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        Highlighter.shadeSymmetric(currentCell,DOUBLE_LETTER);
      }});

    JButton t5 = (new JButton(""));
    t5.setToolTipText("No bonus");
    t5.setBackground(WHITE);
    t5.setHorizontalAlignment(JButton.CENTER);
    t5.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        Highlighter.shadeSymmetric(currentCell,B_NORMAL);
      }});

    pnlBonuses.add(new JLabel("Legend: "));
    pnlBonuses.add(t1);    
    pnlBonuses.add(t2);     
    pnlBonuses.add(t3);     
    pnlBonuses.add(t4);     
    pnlBonuses.add(t5);

  }

コードを書くように誰かに頼んでいるわけではありません。私はそれを望んでいません(しかし、私はそれを無視することはできませんでした!).

上記のコードが行うことは次のとおりです。 ここに画像の説明を入力

4

5 に答える 5

0

=== これは私が 1 時間前に投稿したものを大幅に編集したものです ===

独自の素朴な方法を実装できるかどうかを確認したかったのです。ここにあります:

public class Game implements ActionListener{

  public Color [] backgrounds = {TRIPLE_WORD, TRIPLE_LETTER, 
                                 DOUBLE_WORD, DOUBLE_LETTER, B_NORMAL};

  private void makeScoremasterBonuses(){
    String[] labels = {"3W", "3L", "2W", "2L", "  "};
    JButton but;

    pnlBonuses = new JPanel();
    pnlBonuses.add(new JLabel("Legend:"));

    for (int i = 0; i < labels.length; i++) {
      char wt = labels[i].charAt(0);
      char tp = labels[i].charAt(1);
      but = new JButton(labels[i]);//("" + i);
      but.setBackground(backgrounds[i]);
      but.setHorizontalAlignment(SwingConstants.CENTER);
      but.setActionCommand("" + i);
      but.addActionListener(this);
      but.setToolTipText("This is a " 
          + (i == labels.length - 1 ? "non-bonus" :
                          (wt == '3' ? "triple" : "double") 
                  + " " + (tp == 'L' ? "letter" : "word")) 
          + " cell.");
      pnlBonuses.add(but);
    }    
  }

  public void actionPerformed(ActionEvent evt) {
    int i = Integer.parseInt(evt.getActionCommand());
    Highlighter.shadeSymmetric(currentCell,backgrounds[i]);
  }

これは今(編集後)さらに、応答の質とそれらのために学んだすべての点で、私が開始した最高のスレッドでした. 皆さん、ありがとうございました。

しかし、私はまだ適切に使用できていませんsetActionCommand。私がそれを使用しようとして何をしようとしても、コード的に非常に長くなってしまい、あきらめて、短くて簡単ですが不適切なものを選びました。

大量のコードを追加せずに使用する方法set...getActionCommand正しい方法 (つまり、アクションとして)について何か考えはありますか?

于 2014-05-31T02:03:01.943 に答える