Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 鼠标在按钮上时更改按钮背景色(非滚动)_Java_Swing_Jbutton - Fatal编程技术网

Java 鼠标在按钮上时更改按钮背景色(非滚动)

Java 鼠标在按钮上时更改按钮背景色(非滚动),java,swing,jbutton,Java,Swing,Jbutton,我创建了一个有5个按钮的JFrame,其中1个是播放按钮,用户可以按它来播放音频文件,其余的是用户在听音频后需要选择正确的按钮 我希望按钮在鼠标悬停时改变颜色 我禁用了选择按钮,然后播放音频文件,使用SwingWorker等待音频文件完成,然后再次启用按钮 首先,我使用ButtonModel和changeListener设置背景色。当然,当鼠标在音频剪辑播放完毕后翻转它们时,它们工作得很好 但我发现一个问题是,如果我在播放音频时将鼠标移到按钮上,则该按钮在音频结束后被启用,但没有改变其颜色 谢谢

我创建了一个有5个按钮的JFrame,其中1个是播放按钮,用户可以按它来播放音频文件,其余的是用户在听音频后需要选择正确的按钮

我希望按钮在鼠标悬停时改变颜色

我禁用了选择按钮,然后播放音频文件,使用SwingWorker等待音频文件完成,然后再次启用按钮

首先,我使用ButtonModel和changeListener设置背景色。当然,当鼠标在音频剪辑播放完毕后翻转它们时,它们工作得很好

但我发现一个问题是,如果我在播放音频时将鼠标移到按钮上,则该按钮在音频结束后被启用,但没有改变其颜色

谢谢你的帮助

TLDR:有两种情况

(1) 我按下了播放按钮,没有移动鼠标指针,使指针停留在播放按钮上启用4个按钮后,我将鼠标指针移动到其中任何一个按钮,changelistener工作正常

(2) 我按下播放按钮,将鼠标指针移动到4个按钮中的任何一个4个按钮被启用之前,按钮的颜色在按钮被启用之后没有改变

JFrame的完整演示随附,它可以与MigLayout库完美地运行

public class demo extends JFrame {

private JPanel contentPane, panelBtn, panelWord;
private JButton btnPlay, btnStop, btnWord0, btnWord1, btnWord2, btnWord3;
public static void main (String args[]){
    demo testing = new demo();
}

public demo(){
    super("Demonstrating problem");
    init();
    setVisible(true);
}

private void init(){
    customizedChangeListener clBtn = new customizedChangeListener();
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setBounds(100, 100, 673, 512);
    contentPane = new JPanel();
    setContentPane(contentPane);
    contentPane.setLayout(new BorderLayout(0, 0));
    panelBtn = new JPanel();
    panelBtn.setLayout(new MigLayout("", "[grow][]", ""));
    contentPane.add(panelBtn, BorderLayout.SOUTH);
    panelWord = new JPanel();
    panelWord.setLayout(new MigLayout("", "[grow,fill][grow,fill]", "[grow,fill][grow,fill]"));
    contentPane.add(panelWord, BorderLayout.CENTER);

    btnPlay = new JButton("Play");
    btnPlay.addActionListener(new playAcitonListener());
    panelBtn.add(btnPlay, "cell 0 0, align center");

    btnWord0 = new JButton("A");
    btnWord0.addChangeListener(clBtn);
    panelWord.add(btnWord0, "cell 0 0");

    btnWord1 = new JButton("B");
    btnWord1.addChangeListener(clBtn);
    panelWord.add(btnWord1, "cell 1 0");

    btnWord2 = new JButton("C");
    btnWord2.addChangeListener(clBtn);
    panelWord.add(btnWord2, "cell 0 1");

    btnWord3 = new JButton("D");
    btnWord3.addChangeListener(clBtn);
    panelWord.add(btnWord3, "cell 1 1");

    enableBtn(false);
}

private class customizedChangeListener implements ChangeListener{
    JButton rolledBtn;
    @Override
    public void stateChanged(ChangeEvent e) {
        rolledBtn = (JButton)e.getSource();
        if (rolledBtn.getModel().isRollover())
            rolledBtn.setBackground(Color.green);
        else
            rolledBtn.setBackground(UIManager.getColor("Button.background"));
    }
}

private class playAcitonListener implements ActionListener{
    JButton pressedBtn;
    @Override
    public void actionPerformed(ActionEvent e) {
        pressedBtn = (JButton)e.getSource();
        if (pressedBtn.equals(btnPlay)){
            btnPlay.setEnabled(false);
            new SwingWorker<Void ,Void>(){

                @Override
                protected Void doInBackground() throws Exception {
                    Thread.sleep(2000);
                    return null;
                }

                @Override
                protected void done() {
                    enableBtn(true);
                }
            }.execute();
        }
    }
}

private void enableBtn (boolean idx) {
    if (idx == true){
        btnWord0.setEnabled(true);
        btnWord1.setEnabled(true);
        btnWord2.setEnabled(true);
        btnWord3.setEnabled(true);
    }
    else if (idx == false){
        btnWord0.setEnabled(false);
        btnWord1.setEnabled(false);
        btnWord2.setEnabled(false);
        btnWord3.setEnabled(false);
    }
}
公共类演示扩展了JFrame{
私有JPanel内容窗格、panelBtn、panelWord;
专用JButton btnPlay、btnStop、btnWord0、btnWord1、btnWord2、btnWord3;
公共静态void main(字符串参数[]){
演示测试=新的演示();
}
公共演示(){
超级(“演示问题”);
init();
setVisible(真);
}
私有void init(){
customizedChangeListener clBtn=新的customizedChangeListener();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
立根(100100673512);
contentPane=newjpanel();
setContentPane(contentPane);
setLayout(新的BorderLayout(0,0));
panelBtn=新的JPanel();
panelBtn.setLayout(新的MigLayout(“,“[grow][]”,”);
添加(panelBtn,BorderLayout.SOUTH);
panelWord=新的JPanel();
setLayout(新的MigLayout(“,”[grow,fill][grow,fill],“[grow,fill][grow,fill]”);
添加(panelWord、BorderLayout.CENTER);
btnPlay=新的JButton(“播放”);
btnPlay.addActionListener(新的playAcitonListener());
面板BTN.add(BTN显示“单元格0,对齐中心”);
btnWord0=新的JButton(“A”);
addChangeListener(clBtn);
panelWord.add(btnWord0,“单元格0”);
btnWord1=新的JButton(“B”);
btnWord1.addChangeListener(clBtn);
panelWord.add(btnWord1,“单元格10”);
btnWord2=新的JButton(“C”);
btnWord2.addChangeListener(clBtn);
panelWord.add(btnWord2,“单元格01”);
btnWord3=新的JButton(“D”);
btnWord3.addChangeListener(clBtn);
添加(btnWord3,“单元格1”);
enableBtn(假);
}
私有类customizedChangeListener实现ChangeListener{
JButton rolledBtn;
@凌驾
公共无效状态已更改(更改事件e){
rolledBtn=(JButton)e.getSource();
如果(rolledBtn.getModel().isRollover())
卷曲的背景(颜色为绿色);
其他的
rolledBtn.setBackground(UIManager.getColor(“Button.background”);
}
}
私有类playAcitonListener实现ActionListener{
JButton pressedBtn;
@凌驾
已执行的公共无效操作(操作事件e){
按BTN=(JButton)e.getSource();
如果(按BTN等于(btnPlay)){
btnPlay.setEnabled(false);
新SwingWorker(){
@凌驾
受保护的Void doInBackground()引发异常{
《睡眠》(2000年);
返回null;
}
@凌驾
受保护的void done(){
enableBtn(真);
}
}.execute();
}
}
}
私有void enableBtn(布尔idx){
if(idx==true){
btnWord0.setEnabled(true);
btnWord1.setEnabled(true);
btnWord2.setEnabled(true);
btnWord3.setEnabled(true);
}
else if(idx==false){
btnWord0.setEnabled(false);
btnWord1.setEnabled(false);
btnWord2.setEnabled(false);
btnWord3.setEnabled(false);
}
}

}

您可以使用以下代码检测鼠标何时位于按钮或其他元素上方:

    button.addMouseListener( new MouseAdapter() {
    public void mouseEntered( MouseEvent e ) {
        // your code here (color of button)
    }
} );

正如@DebilsHnd所说的,用mouseExited()将颜色更改回来。

考虑提供一个演示您的问题的示例。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将减少混乱和更好的响应。我不认为“代码片段”是一个可以运行的示例。您描述了我们无法测试和看到的各种问题。请发布相关的代码,我们可以运行。我已经更新了代码,现在它是一个完整的例子,抱歉以前的错误!在mouseExited()事件中,将颜色更改回其原始颜色。我尝试过此操作,但无法完全实现我想要的。我想在音频播放完毕后启用按钮和更改颜色功能。我可以在音频播放完毕后添加鼠标侦听器,但同样的问题也出现了,如果我在音频播放完毕前将鼠标移动到按钮上,按钮在播放完毕后不会改变颜色。当出现
mouseEnter
mouseExit
时,
JButton会自动更新按钮模型,不需要再发明轮子了。OP的问题与他们没有向我们展示的内容有关。我已经在TLDR部分进行了编辑并明确说明,我已经输入了整个可运行演示,请检查:)