سؤال

لدي الرمز التالي:

   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++;

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top