لن يغير 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
ولكن عندما أنقر عليه مرة أخرى ، لا أرى أي تغيير في اللون. لا أحد يعرف لماذا؟
شكرًا
المحلول
انت تفعلها بشكل خاطئ. يجب أن يتم ذلك
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. والألوان. الطول -1 هو في الأساس ثابت. لذلك في كل مرة تنقر فيها على إعداد الخلفية على الألوان [0] ؛
إذا قمت بتغيير طريقة الإجراء الخاصة بك إلى ما يلي ، فستحصل على النتائج التي تبحث عنها:
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(button)){
label.setBackground(COLORS[index % COLORS.length]);
index++;
}
}
أولاً: سيقوم مشغل Modulo دائمًا بإرجاع قيمة بين 0 وواحدة أقل من القيمة التي تم تمريرها إليها. لذا
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++;