2016-03-28 7 views
0

Я работаю над простым приложением для рисования на Java, когда я выбираю цвет, фон кнопки меняется отлично, но возвращенный цвет всегда является предыдущим.JColorChooser возврат ранее выбранного цвета

Например, если я выбираю черный, то синий, он будет рисовать черным цветом. И если я выберу другой цвет после синего цвета, он будет рисовать в синем.

public class ColorChooserBtn extends JButton { 

    private Color color; 

    public ColorChooserBtn() { 
     super(); 
     this.setBackground(Color.BLACK); 
     this.setPreferredSize(new Dimension(16, 16)); 
     this.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) { 
       Color c = JColorChooser.showDialog(null, "Choose a Color", color); 
       if (c != null){ 
        setSelectedColor(c); 
        setBackground(color); 
       } 

      } 
     }); 
    } 
    public Color getSelectedColor() { 
     return color; 
    } 

    public void setSelectedColor(Color newColor) { 
     color = newColor; 
    } 

} 

public class Paint { 
DrawArea drawArea; 
JButton clearBtn; 
ColorChooserBtn colorBtn; 
ActionListener actionListener = new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if(e.getSource() == clearBtn){ 
      drawArea.clear(); 
     } else if(e.getSource() == colorBtn){ 
      drawArea.coloring(colorBtn.getSelectedColor()); 
     } 

    } 
}; 

public Paint() { 
    JFrame frame = new JFrame("Paint"); 
    frame.getContentPane().setLayout(new BorderLayout()); 
    drawArea = new DrawArea(); 
    frame.getContentPane().add(drawArea, BorderLayout.CENTER); 
    JPanel controls = new JPanel(); 
    clearBtn = new JButton("Clear"); 
    clearBtn.addActionListener(actionListener); 
    colorBtn = new ColorChooserBtn(); 
    colorBtn.addActionListener(actionListener); 

    controls.add(clearBtn); 
    controls.add(colorBtn); 

    frame.getContentPane().add(controls,BorderLayout.NORTH); 
    frame.setSize(600, 600); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 
public static void main(String[] args) { 

    new Paint(); 

} 

}

+0

Может быть проблема многопоточности? Сделайте свою переменную цвета 'volatile' и повторите попытку. Не уверен, это работает ... – Seelenvirtuose

+0

Я попробовал, все та же проблема. – edaddou

+0

Затем вы также должны показать код, в котором вы используете цветовую переменную для рисования. Показанный код выглядит нормально. – Seelenvirtuose

ответ

1

Проблема заключается в том порядке, в котором ActionListener «s уведомляются. Как правило, распашные звонки прослушивает LIFO порядка

Таким образом, используя следующий код, с некоторыми дополнительными System.out с ...

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JColorChooser; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

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

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      ColorChooserBtn btn = new ColorChooserBtn(); 
      add(btn); 
      btn.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("Get color"); 
        System.out.println(btn.getSelectedColor()); 
       } 
      }); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

    } 

    public class ColorChooserBtn extends JButton { 

     private Color color; 

     public ColorChooserBtn() { 
      super(); 
      this.setBackground(Color.BLACK); 
      this.setPreferredSize(new Dimension(16, 16)); 
      this.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("Choose color"); 
        Color c = JColorChooser.showDialog(null, "Choose a Color", color); 
        if (c != null) { 
         setSelectedColor(c); 
         setBackground(color); 
        } 
       } 
      }); 
     } 

     public Color getSelectedColor() { 
      return color; 
     } 

     public void setSelectedColor(Color newColor) { 
      color = newColor; 
     } 

    } 
} 

печатает ...

Get color 
null 
Choose color 

Это означает, что ActionListener используется для «получения» выбранного цвета с помощью кнопки, сначала до ActionListener, которая используется для фактического выбора цвета

Один из них, возможно, решение могло бы использовать PropertyChangeListener и вызвать propertyChanged событие, когда selectedColor изменяется, например ...

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JColorChooser; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

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

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      ColorChooserBtn btn = new ColorChooserBtn(); 
      add(btn); 
      btn.addPropertyChangeListener("selectedColor", new PropertyChangeListener() { 
       @Override 
       public void propertyChange(PropertyChangeEvent evt) { 
        System.out.println("Changed"); 
        System.out.println(evt.getNewValue()); 
       } 
      }); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

    } 

    public class ColorChooserBtn extends JButton { 

     private Color color; 

     public ColorChooserBtn() { 
      super(); 
      this.setBackground(Color.BLACK); 
      this.setPreferredSize(new Dimension(16, 16)); 
      this.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("Choose color"); 
        Color c = JColorChooser.showDialog(null, "Choose a Color", color); 
        if (c != null) { 
         setSelectedColor(c); 
         setBackground(color); 
        } 
       } 
      }); 
     } 

     public Color getSelectedColor() { 
      return color; 
     } 

     public void setSelectedColor(Color newColor) { 
      if (newColor != color) { 
       Color oldColor = color; 
       color = newColor; 
       firePropertyChange("selectedColor", oldColor, newColor); 
      } 
     } 

    } 
} 
+0

Спасибо, что это помогает. – edaddou

 Смежные вопросы

  • Нет связанных вопросов^_^