在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();
}
} );