Похоже, что фон JPanel не читается в FocusListener - PullRequest
0 голосов
/ 09 января 2012

Эта проблема появилась после моего последнего вопроса здесь . Я хочу установить для каждой кнопки фокус и потерянный фокус на цвет фона, который находится под основным меню (ContentPane, которое является JPanel), чтобы кнопки выглядели как вкладки. Он может отличаться в разных средах, поэтому он динамический, поэтому я не могу установить его вручную. Теперь, если я регистрирую фон ContentPane, он говорит 238, 238, 238. Если я регистрирую его внутри FocusListener - он также сообщает 238, 238, 238. Если я непосредственно устанавливаю фон кнопки на фон ContentPane вне FocusListener - это работает, но если я установил внутри FocusListener - похоже, что значение не читается и не устанавливается, но если я устанавливаю цвет вручную - это работает. Как это могло произойти? Установка FocusListener для кнопок - это последнее, что я делаю при инициализации основного JPanel.

private void setButtonDefaults(JButton but) {//calls once for each menu button to set defaults
    but.setBorderPainted(false);
    but.setBackground(Color.DARK_GRAY);
    but.setForeground(Color.WHITE);
    but.setName(but.getText().toLowerCase());
    but.setPreferredSize(buttonSize);
    but.addActionListener(this);
    //add focus listener
    but.addFocusListener(new FocusListener() {
        @Override
        public void focusLost(FocusEvent e) {
            Color clr = ContentPane.getBackground();
            log(clr + "");//logs that color is 238, 238, 238
            JButton button = (JButton) e.getSource();
            button.setBackground(clr);//value is not read
            //button.setBackground(new Color(238, 238, 238)); //value is read
        }

        @Override
        public void focusGained(FocusEvent e) {
            //same as focusLost function
        }
    });
}
private void enableOnlyOne(JButton but) { 
/* calls each time when one of menu buttons are pressed. 
All buttons are unpressed and changed colors to black and one
button is set as pressed and changes background color to
ContentPane background color
*/
    //disable all
    setButtonDisabled(MLibrary);
    setButtonDisabled(MScheduler);
    setButtonDisabled(MBudget);
    setButtonDisabled(MReports);
    setButtonDisabled(MManage);
    setButtonDisabled(MSettings);
    //enable one
    but.getModel().setPressed(true);
    but.setBackground(ContentPane.getBackground());//value is read perfect
    but.setForeground(Color.BLACK);
}
private void setButtonDisabled(JButton but) {
    but.getModel().setPressed(false);
    but.setBackground(Color.DARK_GRAY);
    but.setForeground(Color.WHITE);
}

Ответы [ 3 ]

3 голосов
/ 09 января 2012

пожалуйста, не делайте так, так как я прочитал вашу предыдущую ветку ..., теперь я не могу устоять

лучший и простой способ - добавить ChangeListener к ожидаемому JButtons, тогда внутри stateChanged(ChangeEvent changeEvent) вы можете определить, какой из JButtons вызвал это событие, для типа события вы должны извлечь тип этого события из ButtonModel

(остальное зависит от вас, пожалуйста, укажите JButtons в Vector, Array or Enumerations), например

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;

public class MyButtonGroup {

    private JButton button1 = new JButton("Test Enabled / Disabled");
    private JButton button2 = new JButton("Test Enabled / Disabled");
    private JButton button3 = new JButton("Test Enabled / Disabled");

    public MyButtonGroup() {
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(3, 0, 10, 10));
        button1.addChangeListener(changeListener);
        panel.add(button1);
        button2.addChangeListener(changeListener);
        panel.add(button2);
        button3.addChangeListener(changeListener);
        panel.add(button3);
        JFrame frame = new JFrame("Grouping Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }
    private ChangeListener changeListener = new ChangeListener() {

        public void stateChanged(ChangeEvent changeEvent) {
            JButton abstractButton = (JButton) changeEvent.getSource();
            if (abstractButton == button1) {
                ButtonModel buttonModel = abstractButton.getModel();
                boolean armed = buttonModel.isArmed();
                boolean pressed = buttonModel.isPressed();
                boolean selected = buttonModel.isSelected();
                boolean rolover = buttonModel.isRollover();
                System.out.println("Changed: " + armed + "/" + pressed + "/" + selected + "/" + rolover);
            } else if (abstractButton == button2) {
                ButtonModel buttonModel = abstractButton.getModel();
                boolean armed = buttonModel.isArmed();
                boolean pressed = buttonModel.isPressed();
                boolean selected = buttonModel.isSelected();
                boolean rolover = buttonModel.isRollover();
                System.out.println("Changed: " + armed + "/" + pressed + "/" + selected + "/" + rolover);
            }
        }
    };

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                MyButtonGroup xxx = new MyButtonGroup();
            }
        });
    }
}
1 голос
/ 09 января 2012

Поскольку некоторые L & F не отображают изменения в цвете фона, это полезный способ, вы можете рассмотреть другую форму выделения: другую границу, измененный цвет переднего плана, пользовательский значок или подходящую панель фона. Подробнее здесь .

0 голосов
/ 10 января 2012

Так хорошо узнать ответ сам:

private void setButtonDefaults(JButton but) {
    but.setBorderPainted(false);
    but.setBackground(Color.DARK_GRAY);
    but.setForeground(Color.WHITE);
    but.setName(but.getText().toLowerCase());
    but.setPreferredSize(buttonSize);
    but.addActionListener(this);
    //add focus listener
    final Color clr = ContentPane.getBackground();
    final int r = clr.getRed();
    final int g = clr.getGreen();
    final int b = clr.getBlue();
    but.addFocusListener(new FocusListener() {
        @Override
        public void focusLost(FocusEvent e) {
            log("r = " + r + ", g = " + g + ", b = " + b);
            JButton button = (JButton) e.getSource();
            button.setBackground(new Color(r, g, b));
        }

        @Override
        public void focusGained(FocusEvent e) {
            JButton button = (JButton) e.getSource();
            button.setBackground(new Color(r, g, b));
        }
    });
}

Спасибо всем, кто пытался (и делал), чтобы помочь мне

...