Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.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
JButton模型中的Java Swing-isRollover()值_Java_Swing_Jbutton_Rollover - Fatal编程技术网

JButton模型中的Java Swing-isRollover()值

JButton模型中的Java Swing-isRollover()值,java,swing,jbutton,rollover,Java,Swing,Jbutton,Rollover,我在测试按钮模型的行为时遇到了一个奇怪的情况。isRollover()方法不会返回预期的(根据我)值 以下是我刚刚创建的示例代码: import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import

我在测试
按钮模型的行为时遇到了一个奇怪的情况。
isRollover()
方法不会返回预期的(根据我)值

以下是我刚刚创建的示例代码:

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 *
 * @author rmu
 */
public class NewClass extends JFrame {

    private static final Logger logger = Logger.getLogger(NewClass.class.getName());

    static {
        logger.setLevel(Level.INFO);
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("Test MVC");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JButton btn = new JButton("Test button");
        final JLabel lbl = new JLabel("");

        btn.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                logger.log(Level.INFO, "\nButton armed: " + btn.getModel().isArmed()
                        + "\nButton pressed: " + btn.getModel().isPressed()
                        + "\nButton selected: " + btn.getModel().isSelected()
                        + "\nButton rollover: " + btn.getModel().isRollover()
                );
                lbl.setText(btn.getModel().isRollover() ? "Mouse is over the button" : "Mouse is NOT over the button");
            }
        });

        frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS));
        frame.getContentPane().add(btn);
        frame.getContentPane().add(lbl);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
回购步骤:

  • 将鼠标移到按钮-->一切正常
  • 按鼠标键-->一切正常
  • (不释放鼠标按钮)移动鼠标,使其不再位于按钮上方-->一切正常
  • (不释放…)再次将鼠标移到按钮上-->
    isRollback()
    方法返回
    false
    (请参阅日志和
    JLabel

这是正确的行为还是错误?我想编写一些使用此属性的代码,但我不确定是否可以依赖它。

我不依赖滚动行为。从L&F工具包可以(其中一些确实可以)修改其行为的意义上讲,这并不是真正的标准化

也就是说,实现您自己的鼠标侦听器以获得您想要的行为应该很简单

这是正确的行为还是错误

查看源代码,看看它在做什么

基本按钮列表中
有以下代码:

public void mouseEntered(MouseEvent e) {
    AbstractButton b = (AbstractButton) e.getSource();
    ButtonModel model = b.getModel();
    if (b.isRolloverEnabled() && !SwingUtilities.isLeftMouseButton(e)) {
        model.setRollover(true);
    }
    if (model.isPressed())
            model.setArmed(true);
}
因此,按下鼠标左键时不会设置滚动

只需使用您自己的
MouseListener
并收听
mouseEntered/mouseExited
事件。

,即可使用SwingUtilities.isLeftMouseButton