0

次のコードがあります。

   public class Test extends JFrame implements ActionListener{
 private static final Color TRANSP_WHITE = new Color(new Float(1), new Float(1), new Float(1), new Float(0.5)); 
 private static final Color TRANSP_RED = new Color(new Float(1), new Float(0), new Float(0), new Float(0.1));
 private static final Color[] COLORS = new Color[]{ TRANSP_RED, TRANSP_WHITE};
 private int index = 0;

 private JLabel label;
 private JButton button; 
 public Test(){
  super();

  setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
  label = new JLabel("hello world");
  label.setOpaque(true);
  label.setBackground(TRANSP_WHITE);

  getContentPane().add(label);

  button = new JButton("Click Me");
  button.addActionListener(this);

  getContentPane().add(button);

  pack();
  setVisible(true);
 }

 @Override
 public void actionPerformed(ActionEvent e) {
  if(e.getSource().equals(button)){
   label.setBackground(COLORS[index % (COLORS.length - 1)]);
index++;
      }
     }

 public static void main(String[] args) {
  new Test();
 }
    }

TRANSP_WHITE実行すると背景付きのラベルが表示され、ボタンをクリックするとこの色が変わりTRANSP_REDますが、もう一度クリックすると色が変わりません。誰かが理由を知っていますか?

ありがとう

4

4 に答える 4

3

さて、あなたは何が起こると予想していましたか?

label.setBackground(COLORS[index % (COLORS.length - 1)]);

インデックス変数は 0 にハード コードされています。また、COLORS.length -1 は基本的に定数です。したがって、設定をクリックするたびに、背景を COLORS[0] に設定します。

アクション メソッドを次のように変更すると、探している結果が得られます。

 @Override
 public void actionPerformed(ActionEvent e) {
  if(e.getSource().equals(button)){
   label.setBackground(COLORS[index % COLORS.length]);
   index++;
  }
 }

まず、モジュロ演算子は常に、0 から渡された値より 1 少ない値を返します。そう

index % COLORS.length

常に 0 と COLORS.length -1 の間の値を返します。

2 番目: 呼び出しのたびにインデックスをインクリメントするのを忘れていました。

于 2010-03-21T13:37:37.510 に答える
2

これがあなたが使わなければならないコードです

label.setBackground(COLORS[index % (COLORS.length)]);
index++;

于 2010-03-21T14:16:13.233 に答える
2

おい!インデックスをインクリメントするのを忘れました。この式では:

label.setBackground(COLORS[index % (COLORS.length - 1)]);

index % (COLORS.length - 1)は常に 0 です。

ところで。new Float(1)作成時に使用する必要はありませんColor1Fも動作するはずです。

于 2010-03-21T13:40:20.157 に答える
1

それは間違っている。そのようにすればいい

label = new JLabel("hello world"){
     public void paintComponent(Graphics g)
     {
         //draw background
         Color old=g.getColor();
         g.setColor(getBackground());
         g.fillRect(0,0,getWidth(),getHeight());
         g.setColor(old);
         super.paintComponent(g);
     }
};
label.setOpaque(false); // your component is not opaque!
于 2010-03-21T14:46:45.047 に答える