gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:09:25 29 4
gpt4 key购买 nike

此问题出现在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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com