首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在FocusListener中似乎没有读取JPanel背景

在FocusListener中似乎没有读取JPanel背景
EN

Stack Overflow用户
提问于 2012-01-09 20:51:18
回答 3查看 495关注 0票数 0

这个问题出现在my last question here之后。我想设置每个按钮聚焦和失去焦点的背景颜色,这是下面的主菜单(ContentPane,这是JPanel),使按钮看起来像标签。它可以在不同的环境中不同,所以它是动态的,所以我不能手动设置它。现在,如果我登录ContentPane背景,它会显示238,238,238。如果我在FocusListener中记录它-它还会显示238,238,238。如果我在FocusListener外部直接将按钮的背景设置为ContentPane背景-它可以工作,但如果我在FocusListener内设置-它看起来值不能读取和设置,但如果我手动设置颜色-它可以工作。这怎么会发生呢?将FocusListener设置为buttons是我在初始化主JPanel时所做的最后一件事。

代码语言:javascript
复制
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);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-10 18:22:09

我自己找到答案真是太好了:

代码语言:javascript
复制
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));
        }
    });
}

感谢每一个试图(并且确实)帮助我的人。

票数 0
EN

Stack Overflow用户

发布于 2012-01-09 21:32:33

请不要这样做,因为我读了你之前的帖子……现在我忍不住了

更好也是最简单的方法是将ChangeListener添加到预期的JButtons中,然后在stateChanged(ChangeEvent changeEvent)中您可以确定哪个JButtons触发了此事件,对于事件类型,您必须从ButtonModel中提取此事件的类型

(rest由您决定,请将这些JButtons放到Vector, Array or Enumerations中),例如

代码语言:javascript
复制
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();
            }
        });
    }
}
票数 3
EN

Stack Overflow用户

发布于 2012-01-09 23:29:14

由于某些L&F不显示对背景颜色的更改是一种有用的方式,因此您可能需要考虑另一种突出显示形式:不同的边框、更改的前景颜色、自定义图标或合适的背景面板。更多here

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8788696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档