Я изучаю 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);
Вероятно, ответ слишком очевиден, но я просто не могу видеть его в тот момент, ,
Это был отличный совет! Я даже не знал об PropertyChangeListener для JPanel в библиотеках .beans. Я принял ваши предложенные изменения в Colors.java почти так же, как и принял и большинство частей в Main.java. Ваш код доказал, что цвет от JColorChooser можно использовать и использовать в качестве фона для frontPg. Тем не менее, я все еще борется с тем, как использовать этот (выбранный) цвет в другом методе для нового фона JButton (пользователь должен выбрать цвет новых кнопок, а «добавить» должен показать новый btn с новым clr ». –
Я все еще застрял не имея возможности передавать экземпляры Color, поскольку PropertyChangeListener и т. д. довольно строго определены (и не допускают никакого возвращаемого значения). Должен ли я расширять их своими собственными методами, чтобы передать цвет другим классам или наилучший подход? –
@ JackGarfield: слушатели смены свойств ** do ** имеют эффективное возвращаемое значение - 'getNewValue()', возвращаемое из PropertyChangeEvent. Но, несмотря на это, другое решение - вызывать метод getter из прослушанного класса, когда слушатель уведомляет слушателей Я уверен, что вы можете понять специфику. Если нет, задайте новый вопрос и опубликуйте свой [mcve]. –