質問

私は、次のコードを持っています:

   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に変わりますが、私は再びそれをクリックしたときに、私は色の変化は見られません。 DOESの誰もが知っているなぜ?

おかげ

役に立ちましたか?

解決

あなたは間違ってそれをやっています。これは、そのように行われるべきである。

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!

他のヒント

さて、何が起こることを期待していた?

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

は、インデックス変数は、ハード0に符号化され、colors.lengthで-1は本質的に一定です。たびに、あなたは色に背景を設定する]をクリックして、[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ます。

第二:あなたはすべての呼び出し後にインクリメントインデックスに忘れた。

ねえ!あなたは増分インデックスに忘れてしまいました。この式でます:

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

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

ところで。あなたはnew Float(1)を作成するときにColorを使用する必要はありません。 1Fはあまりにも動作するはずです。

ここでは、

を使用する必要がコードがあります

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top