Java jSplitPane鼠标悬停时显示和隐藏左窗格
我正在开发一个可以显示和隐藏分割平面的应用程序。 我读过一些关于如何获得这个的文章,但这不是我想要的 这是我写的代码: 我现在正在使用netbeansJava jSplitPane鼠标悬停时显示和隐藏左窗格,java,swing,mouseevent,jsplitpane,Java,Swing,Mouseevent,Jsplitpane,我正在开发一个可以显示和隐藏分割平面的应用程序。 我读过一些关于如何获得这个的文章,但这不是我想要的 这是我写的代码: 我现在正在使用netbeans private void jSplitPane1MouseEntered(java.awt.event.MouseEvent evt) { if(MouseInfo.getPointerInfo().getLocation() == jSplitPa
private void jSplitPane1MouseEntered(java.awt.event.MouseEvent evt) {
if(MouseInfo.getPointerInfo().getLocation() == jSplitPane1.getLeftComponent().getLocation()){
jSplitPane1.setDividerLocation(100);
System.out.println("Mouse Entered");
}else{
jSplitPane1.setDividerLocation(20);
System.out.println("Mouse Exited");
}
}
我提到这些职位:
我想要发生的是,当我将鼠标移到jSplitPane的左侧时,我会按照我的第一个
if
语句将分隔符扩展到100,当它存在于左侧时,它会收缩回分隔符位置20。这真的非常棘手
您可以在“左”组件上使用MouseListener
,并监视mouseenterned
和mouseExited
事件,但当您移入和移出具有MouseListener
的子组件(如JButton
)时,也会触发这些事件
好的,您可以在JSplitPane
上使用MouseMotionListener
,监视mouseMoved
事件,并检查鼠标光标的位置,但组件(左/右)获得自己的MouseListener
时,这一切都会化为乌有,由于MouseEvent
s不再传送到JSplitPane
因此,最后一个选项是将全局AWTListener
附加到事件队列,并监视JSplitPane
本身上发生的事件,例如
这真的很棘手 您可以在“左”组件上使用
MouseListener
,并监视mouseenterned
和mouseExited
事件,但当您移入和移出具有MouseListener
的子组件(如JButton
)时,也会触发这些事件
好的,您可以在JSplitPane
上使用MouseMotionListener
,监视mouseMoved
事件,并检查鼠标光标的位置,但组件(左/右)获得自己的MouseListener
时,这一切都会化为乌有,由于MouseEvent
s不再传送到JSplitPane
因此,最后一个选项是将全局AWTListener
附加到事件队列,并监视JSplitPane
本身上发生的事件,例如
可以问题是?哦,我很抱歉!我在忙我的工作。我来编辑这篇文章。你看!我需要根据splitPane进行更改,因为在我的splitPane中是动态面板。好吗?问题是?哦,我很抱歉!我在忙我的工作。我来编辑这篇文章。你看!我需要根据splitPane进行更改,因为我的splitPane中有动态面板。很抱歉回复太晚,谢谢您的回答。我看到它工作得很好,但老实说,我不太确定如何将它添加到我的应用程序中。我使用的是NetBeans,我还不完全熟悉向组件添加自定义代码,但我从您的代码中了解到:
1。您获取了窗格的边界并检查它是否包含鼠标的当前位置。
然后,我感到困惑。基本上,我做的第一件事是检查MouseEvent#点
是否在JSplitPane
的边界内,然后我将MouseEvent
转换为JSplitPane
的上下文,然后检查MouseEvent
是否在leftPane
的上下文中MouseEvent
s是上下文的,会自动转换为生成它们的组件的坐标上下文(即0x0是组件的左上角),谢谢!现在开始工作了!谢谢你解释这个概念。我只是想在把东西放进去之前了解一下它是如何工作的。我将不得不编译这篇文章,因为它在将来会很有用。很抱歉回复太晚,谢谢你的回答。我看到它工作得很好,但老实说,我不太确定如何将它添加到我的应用程序中。我使用的是NetBeans,我还不完全熟悉向组件添加自定义代码,但我从您的代码中了解到:1。您获取了窗格的边界并检查它是否包含鼠标的当前位置。
然后,我感到困惑。基本上,我做的第一件事是检查MouseEvent#点
是否在JSplitPane
的边界内,然后我将MouseEvent
转换为JSplitPane
的上下文,然后检查MouseEvent
是否在leftPane
的上下文中MouseEvent
s是上下文的,会自动转换为生成它们的组件的坐标上下文(即0x0是组件的左上角),谢谢!现在开始工作了!谢谢你解释这个概念。我只是想在把东西放进去之前了解一下它是如何工作的。我将不得不编译这个,因为它在将来会很有用。
import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new BorderLayout());
JSplitPane pane = new JSplitPane();
pane.setLeftComponent(makePane(Color.RED));
pane.setRightComponent(makePane(Color.BLUE));
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
@Override
public void eventDispatched(AWTEvent event) {
if (event instanceof MouseEvent) {
MouseEvent me = (MouseEvent) event;
if (pane.getBounds().contains(me.getPoint())) {
System.out.println("Global Motion in the pane...");
me = SwingUtilities.convertMouseEvent(me.getComponent(), me, pane);
Component left = pane.getLeftComponent();
if (left.getBounds().contains(me.getPoint())) {
pane.setDividerLocation(100);
} else {
pane.setDividerLocation(20);
}
}
}
}
}, MouseEvent.MOUSE_MOTION_EVENT_MASK);
// You don't need this, this is to demonstrate
// that mouse events aren't hitting your component
// via the listener
pane.addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
System.out.println("Motion in the pane...");
Component left = pane.getLeftComponent();
if (left.getBounds().contains(e.getPoint())) {
pane.setDividerLocation(100);
} else {
pane.setDividerLocation(20);
}
}
});
pane.setDividerLocation(20);
add(pane);
}
protected JPanel makePane(Color background) {
JPanel pane = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 100);
}
};
pane.setLayout(new GridBagLayout());
pane.add(new JButton("..."));
pane.setBackground(background);
pane.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("...");
}
});
return pane;
}
}
}