5

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 );

  }
}

ありがとう、

4

1 に答える 1

4

イベントは、mouseExitedカーソルがJPanel- の境界を離れるかJPanel、サブコンポーネントの 1 つに入ると、トリガーされます。ボタンは のすぐ端にあるためJPanel、カーソルがJPanel左の途中で再び に入ることはなく、終了することはできません。

mouseEnteredボタンのメソッドを変更してMouseListener、コントロール パネルが開いている場合はそれを折りたたむことができMouseListener、ユーザーがフレームの境界線から離れる場合に既存の処理を行うことができます。ユーザーがボタンを追いかけて再トリガーするのを防ぎたい場合は、コントロールペインの展開/折りたたみ状態を追跡する必要があります (SwingX API はおそらく既にこれを行っています)。下)。

私の変更した MouseListener:

toggle.addMouseListener( new MouseAdapter()
{
  @Override
  public void mouseEntered( MouseEvent e )
  {
      toggle.doClick();
  }
} );
于 2012-07-03T10:12:54.970 に答える