2015-10-05 2 views
1

Я изучаю Java всего несколько недель, поэтому имейте это в виду. Мне удалось решить многие проблемы до этого:Как использовать JColorChooser для данного цвета в других классах?

То, что я пытаюсь достичь, это использовать JComponent в виде вкладок, чтобы в на одной вкладке вы можете выбрать цвет (мой println показывает, что на самом деле он получает значение sRGB). Затем в другом классе я должен получить эту ценность и использовать ее при раскраске JPanels. Могу ли я просто передать объект «Цвет» или что это лучший способ достичь. То, что я пытаюсь здесь, не работает слишком хорошо. Извините за грязный код - я новичок ... Вот основная часть выбора цвета:

public class Colors extends JPanel implements ChangeListener { 

    private JColorChooser jcc = null; 
    protected JLabel title; 
    static Color newColor; 

    public Colors() { 
     super(new BorderLayout()); 

     //Set up the banner at the top of the window 
     title = new JLabel(); 

     //Set up color chooser for setting text color 
     jcc = new JColorChooser(title.getForeground()); 
     jcc.getSelectionModel().addChangeListener(this); 
     jcc.setBorder(BorderFactory.createTitledBorder(
       "Choose New Color")); 

     AbstractColorChooserPanel[] panels=jcc.getChooserPanels(); 
     for(AbstractColorChooserPanel p:panels) { 
      String displayName = p.getDisplayName(); 
      switch (displayName) { 
       case "HSV": 
        jcc.removeChooserPanel(p); 
        break; 
       case "HSL": 
        jcc.removeChooserPanel(p); 
        break; 
       case "CMYK": 
        jcc.removeChooserPanel(p); 
        break; 
       case "RGB": 
        jcc.removeChooserPanel(p); 
        break; 
      } 
     } 
     add(jcc, BorderLayout.PAGE_END); 
    } 



    public void stateChanged(ChangeEvent e) { 
     Color newColor = jcc.getColor(); 
     title.setForeground(newColor); 
     System.out.println("color = " + newColor); 
    } 

    public static Color getNewCol() { 
     System.out.println("this now =" + newColor); 
     return newColor; 
    } 

    public static Component createAndShowGUI() { 
     //Create and set up the window. 
     JFrame frame = new JFrame("Color Selector"); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     //Create and set up the content pane. 
     JComponent newContentPane = new Colors(); 
     return newContentPane; 

    } 
} 

И тогда я пытаюсь достать выбранного цвета в классе Main.java в таким образом (что, скорее всего, неверно). Отмечу также, что значение, кажется, остается всегда нулевой - вероятно, я инстанцировании в неправильном направлении (значение потеряется?)

a.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("Click add"); 
       value++; 

       if (value < 21) { 


        JButton jb1 = new JButton(); 

        //How to get the COLOR from the JColorChooser class? 
        Color box = Colors.getNewCol(); 

        jb1.setBackground(box); 
        jb1.setOpaque(true); 

        //FOR TEST ONLY jb1.setBackground(Color.BLUE); 
        panel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); 
        panel.add(jb1); 
        panel.setVisible(true); 

        //window.add(paneeli); 

        window.pack(); 

        d = new Dimension(700, 500); 
        window.setSize(d); 

Вероятно, ответ слишком очевиден, но я просто не могу видеть его в тот момент, ,

ответ

2

Я бы взял вашу статическую переменную newColor и сделал ее нестатической. В моем ChangeListener я запустил встроенный PropertyChangeSupport JPanel, чтобы слушатели могли быть уведомлены. Ключом является использование шаблона проектирования наблюдателя. Например:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import javax.swing.*; 
import javax.swing.event.*; 

@SuppressWarnings("serial") 
public class TestColors extends JPanel { 
    private JTabbedPane tabbedPane = new JTabbedPane(); 
    private Colors colors = new Colors(); 
    private JPanel colorDisplayPanel = new JPanel(); 

    public TestColors() { 
     tabbedPane.add("Colors", colors); 
     tabbedPane.add("Color Display", colorDisplayPanel); 
     setLayout(new BorderLayout()); 
     add(tabbedPane); 

     // add a PropertyChangeListener to our Colors isntance. 
     colors.addPropertyChangeListener(Colors.NEW_COLOR, 
       new PropertyChangeListener() { 

        @Override 
        public void propertyChange(PropertyChangeEvent evt) { 
         Color color = (Color) evt.getNewValue(); 
         colorDisplayPanel.setBackground(color); 
        } 
       }); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("TestColors"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new TestColors()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 

@SuppressWarnings("serial") 
class Colors extends JPanel implements ChangeListener { 
    public static final String NEW_COLOR = "new color"; 
    private JColorChooser jcc = null; 
    protected JLabel title; 
    private Color newColor = null; 

    public Colors() { 
     super(new BorderLayout()); 

     // Set up the banner at the top of the window 
     title = new JLabel("This is my Banner!", SwingConstants.CENTER); 

     // Set up color chooser for setting text color 
     jcc = new JColorChooser(title.getForeground()); 
     jcc.getSelectionModel().addChangeListener(this); 
     jcc.setBorder(BorderFactory.createTitledBorder("Choose New Color")); 

     add(jcc, BorderLayout.CENTER); 
     add(title, BorderLayout.PAGE_START); 
    } 

    public void stateChanged(ChangeEvent e) { 
     // Color newColor = jcc.getColor(); 
     Color oldValue = newColor; 
     newColor = jcc.getColor(); 

     // fire a notification to the Colors JPanel's property change support 
     // object. Any listeners will be notified of the color change 
     firePropertyChange(NEW_COLOR, oldValue, newColor); 
     title.setForeground(newColor); 
    } 

    public Color getNewCol() { 
     System.out.println("this now =" + newColor); 
     return newColor; 
    } 

} 
+0

Это был отличный совет! Я даже не знал об PropertyChangeListener для JPanel в библиотеках .beans. Я принял ваши предложенные изменения в Colors.java почти так же, как и принял и большинство частей в Main.java. Ваш код доказал, что цвет от JColorChooser можно использовать и использовать в качестве фона для frontPg. Тем не менее, я все еще борется с тем, как использовать этот (выбранный) цвет в другом методе для нового фона JButton (пользователь должен выбрать цвет новых кнопок, а «добавить» должен показать новый btn с новым clr ». –

+0

Я все еще застрял не имея возможности передавать экземпляры Color, поскольку PropertyChangeListener и т. д. довольно строго определены (и не допускают никакого возвращаемого значения). Должен ли я расширять их своими собственными методами, чтобы передать цвет другим классам или наилучший подход? –

+0

@ JackGarfield: слушатели смены свойств ** do ** имеют эффективное возвращаемое значение - 'getNewValue()', возвращаемое из PropertyChangeEvent. Но, несмотря на это, другое решение - вызывать метод getter из прослушанного класса, когда слушатель уведомляет слушателей Я уверен, что вы можете понять специфику. Если нет, задайте новый вопрос и опубликуйте свой [mcve]. –

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