【问题标题】:Java Swing - isRollover() value in JButton modelJava Swing - JButton 模型中的 isRollover() 值
【发布时间】:2015-09-11 11:10:00
【问题描述】:

我在测试ButtonModel 的行为时遇到了一个奇怪的情况。 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

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

【问题讨论】:

标签: java swing jbutton rollover


【解决方案1】:

这是正确的行为还是错误?

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

BasicButtonListener 你有这个代码:

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 事件。

【讨论】:

    【解决方案2】:

    我不会依赖翻转行为。从 L&F 工具包可以(其中一些可以)修改其行为的意义上说,它并不是真正的标准化。

    也就是说,实现您自己的鼠标侦听器以获得您想要的行为应该是微不足道的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      相关资源
      最近更新 更多