java - 鼠标悬停触发 JXCollapsiblePane

标签 java swing mouseevent swingx

在 SwingX 的例子中,JXCollapsiblePane 与按钮一起使用,但我想用鼠标事件转置它。 在我的示例中,JXCollapsiblePane 一开始是关闭的。只有当用户将鼠标放在按钮上时才会打开 JXCollapsiblePane。当鼠标离开该区域时,假定 JXCollapsiblePane 再次折叠。 我的问题:当鼠标通过按钮离开该区域时,JXCollapsiblePane 没有折叠。

public class CollapsiblePaneDemo
{

  /**
   * @param args
   */
  public static void main( String[] args )
  {
    final JXCollapsiblePane cp = 
        new JXCollapsiblePane( JXCollapsiblePane.Direction.RIGHT );

    // JXCollapsiblePane can be used like any other container
    cp.setLayout( new BorderLayout() );

    // the Controls panel with a textfield to filter the tree
    JPanel controls = new JPanel( new FlowLayout( FlowLayout.LEFT, 4, 0 ) );
    controls.add( new JLabel( "Search:" ) );
    controls.add( new JTextField( 10 ) );
    controls.add( new JButton( "Refresh" ) );
    controls.setBorder( new TitledBorder( "Filters" ) );

    cp.add( "Center", controls );

    JXFrame frame = new JXFrame();
    frame.setLayout( new BorderLayout() );

    // Then the tree - we assume the Controls would somehow filter the tree
    JScrollPane scroll = new JScrollPane( new JTree() );
    // Put the "Controls" first
    frame.add( "Center", scroll );


    // Show/hide the "Controls"
    final JButton toggle = new JButton( cp.getActionMap()
        .get( JXCollapsiblePane.TOGGLE_ACTION ) );
    toggle.setText( "-" );
    toggle.setPreferredSize( new Dimension( 20, toggle.getSize().height ) );

    toggle.addMouseListener( new MouseAdapter()
    {
      @Override
      public void mouseEntered( MouseEvent e )
      {
        if ( cp.getSize().width == 0 )
        {

          toggle.doClick();
        }
      }
    } );

    final JPanel panel = new JPanel();
    panel.setLayout( new BorderLayout() );
    panel.add( "Center", toggle );
    panel.add( "East", cp );

    panel.addMouseListener( new MouseAdapter()
    {
      @Override
      public void mouseExited( MouseEvent e )
      {
        if ( !panel.contains( e.getPoint() ) )
        {
          toggle.doClick();
        }
      }
    } );

    frame.add( "East", panel );

    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    frame.pack();
    cp.setCollapsed( true );
    frame.setVisible( true );

  }
}

谢谢,

最佳答案

当光标离开 JPanel 时触发 mouseExited 事件 - 离开 JPanel 的边界或输入其中之一子组件。因为按钮就在 JPanel 的边缘,所以光标永远不会在左边的路上再次进入 JPanel,因此无法退出它。

您可以修改按钮的 MouseListener 中的 mouseEntered 方法,以便在控制面板打开时折叠它,并让您现有的 MouseListener 处理这种情况用户通过框架边框离开的地方。如果你想阻止用户追逐按钮并重新触发它(我没有在代码中打扰),你需要跟踪控制面板的展开/折叠状态(SwingX API 可能已经为你做了这个)下)。

我修改的 MouseListener:

toggle.addMouseListener( new MouseAdapter()
{
  @Override
  public void mouseEntered( MouseEvent e )
  {
      toggle.doClick();
  }
} );

关于java - 鼠标悬停触发 JXCollapsiblePane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11307884/

相关文章:

带有 GSON 的 Java 堆空间

java - 通过扩展线程类创建线程时出现困惑

java - 捕获Spring数据异常

javascript - 在两个函数之间传递变量

java - 如何从内存中的 Derby 数据库表中选择数据?

java - dataModelUpdate 后自动排序 JTable

java - 为什么 PaintComponent 不能接受 Graphics2D 对象?

java - 具有空布局的 JPanel 类不显示组件

java - 使用 mousePress() 方法时出错

javascript - 当 Firefox 自动滚动时捕获鼠标滚轮事件