JLabelの文句を言わないの変色倍
-
21-09-2019 - |
質問
私は、次のコードを持っています:
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++;
所属していません StackOverflow