java - 似乎 JPanel 背景未在 FocusListener 中读取

标签 java swing focus background-color jbutton

此问题出现在my last question here之后。我想将每个按钮聚焦和失去焦点背景设置为主菜单(ContentPane 即 JPanel)下方的背景颜色,因此按钮看起来像选项卡。它在不同的环境中可能会有所不同,因此它是动态的,所以我无法手动设置它。现在,如果我记录 ContentPane 背景,它会显示 238, 238, 238。如果我将其记录在 FocusListener 中 - 它也会显示 238, 238, 238。如果我直接将按钮的背景设置为 FocusListener 之外的 ContentPane 背景 - 它可以工作,但如果我设置在 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);
}

最佳答案

请不要这样做,因为我读过你之前的帖子......,现在我无法抗拒

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

(其余由您决定,请将这些 JButtons 放入 Vector、Array 或 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();
            }
        });
    }
}

关于java - 似乎 JPanel 背景未在 FocusListener 中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8788696/

相关文章:

带 GUI 的 Java 结果集 SQL

flutter - 如何抑制 Flutter 中的滚动到 View 行为?

java - MongoDb Criteria 查询 LTE 不适用于数字

java - java中JPG图像的像素的精确值

java - 错误: package org. jdesktop.layout不存在

java - 更改焦点 JTextField 的文本

css - 菜单中的下划线过渡

javascript - a4j :support is used 时焦点消失

JavaFX "toolkit not initialized"在一个测试类中而不是另外两个;区别在哪里?

java - 找不到 JVisualVM 放置性能数据的位置