0

ループと「BorderLayout」に問題があります。ドライバーを使用してこれをコンパイルして実行すると、add.west(etc) が進行中の add.west によって上書きされているようです。「南」パネルの 9 番目のコンポーネントだけが残っており、「東」と「西」は完全に空です。「for (int i=0; i<8; i++){」を「for (int i=0; i<2; i++){」に変更すると、必要な 9 の 2 番目の要素のみが取得されます。 「西」パネル。誰でも理由を教えてください。私の無知を許してください。私は初心者です。

ありがとうございました。ジョー

これは大まかに次のようになります。

(WEST)                                           (EAST)

btn0, label0, label0                            btn4, label4, label4
btn1, label1, label1                            btn5, label5, label5
btn2, label2, label2                            btn6, label6, label6
btn3, label3, label3                            btn7, label7, label7

                           (SOUTH)
                    btn8, label8, label8

//コードはここから始まります:

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

public class CoinPanel extends JPanel{
  private JButton buttons[] = new JButton[9];
  private JLabel multiplySign[] = new JLabel[9];
  private JLabel coinCount[] = new JLabel[9];
  String [] names= {"1c", "2c", "5c", "10c", "20c", "50c", "€1", "€2", "Reset"};
  int [] values= {1, 2, 5, 10, 20, 50, 100, 200, 0};

  public CoinPanel(){
    for (int i=0; i<8; i++){
      buttons[i] = new JButton(names[i]);
      buttons[i].addActionListener(new BtnListener());
      coinCount[i] = new JLabel("0", JLabel.CENTER);
      coinCount[i].setBorder(BorderFactory.createLineBorder(Color.black));
      multiplySign[i] = new JLabel ("x", JLabel.CENTER);

// ここからのレイアウト:

      setLayout (new BorderLayout());
      JPanel west= new JPanel();
      west.setBackground(Color.BLACK);
      JPanel east= new JPanel();
      east.setBackground(Color.RED);
      JPanel south= new JPanel();
      south.setBackground(Color.BLUE);

      if(i<4){
        west.add (buttons[i]);
        west.add (multiplySign[i]);
        west.add (coinCount[i]);
      }
      else if(i<8){
        east.add (buttons[i]);
        east.add (multiplySign[i]);
        east.add (coinCount[i]);
      } 
      else{
        multiplySign[i].setText("TOTAL");
        south.add (multiplySign[i]);
        south.add (coinCount[i]);
        south.add (buttons[i]);
      }
      add(west, BorderLayout.WEST);     
      add(east, BorderLayout.EAST);
      add(south, BorderLayout.SOUTH);
     }

    setPreferredSize (new Dimension(450,300));
  }

//ここまで^^

private class BtnListener implements ActionListener{
    public void actionPerformed (ActionEvent event){
      String [] text = new String[9];
      int [] intArray = new int [9];
      double sum =0;
      for (int i=0; i<(intArray.length-1); i++){
        if(event.getSource() == buttons[i]){
          text[i] = coinCount[i].getText();
          intArray[i]=Integer.parseInt(text[i]);
          intArray[i] = ((intArray[i]) +1);
          coinCount[i].setText(intArray[i] + "");
       }    
       if(event.getSource() == buttons[8]){
         coinCount[i].setText("0");
       }
       sum += (Integer.parseInt(coinCount[i].getText())*values[i]);
       NumberFormat nf = NumberFormat.getCurrencyInstance();
       coinCount[8].setText(nf.format(sum/100)+"");
      }
    }
  }
}

//そしてこれがドライバーです:

import javax.swing.*;

public class CoinSorter{
   public static void main(String[] args){ 
      JFrame frame = new JFrame ("Coin Counter Example");
      frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
      CoinPanel panel = new CoinPanel();
      frame.getContentPane().add(panel);
      frame.pack();
      frame.setVisible(true);
   }
}
4

2 に答える 2

2

3 つの場所に 1 つのパネルを追加するだけではないのですか?

いいえ、ループ内のコードが多すぎます。

1) ループを実行するたびに 3 つの新しいパネルを作成しています。

  • ループを開始する前に、西、東、南の 3 つのパネルを作成する必要があります。

2) 次に、ループの最後で、これらの各パネルをメイン パネルに追加します。

  • 3 つのパネルは、ループの外側のメイン パネルに追加する必要があります。
于 2013-03-01T19:57:43.517 に答える
-1

一度に配置できるコンポーネントは 1 つだけです。別のコンポーネントを同じ場所 (BorderLayout.WEST など) に追加すると、前のコンポーネントが削除されます。これは、WEST コンポーネントを追加するたびにメンバー変数westが新しい値を取得し、古い値が失われることを明確に示す BorderLayout クラスのコードです。

if ("Center".equals(name)) {
    center = comp;
} else if ("North".equals(name)) {
    north = comp;
} else if ("South".equals(name)) {
    south = comp;
} else if ("East".equals(name)) {
    east = comp;
} else if ("West".equals(name)) {
    west = comp;
} else if (BEFORE_FIRST_LINE.equals(name)) {
    firstLine = comp;
} else if (AFTER_LAST_LINE.equals(name)) {
    lastLine = comp;
} else if (BEFORE_LINE_BEGINS.equals(name)) {
    firstItem = comp;
} else if (AFTER_LINE_ENDS.equals(name)) {
    lastItem = comp;
} else {
    throw new IllegalArgumentException("cannot add to layout: unknown constraint: " + name);
}
  }
}

他の配置についても同様です。

于 2013-03-01T16:59:38.413 に答える