gpt4 book ai didi

java - 如何使嵌套的 JScrollPanes 正常工作?

转载 作者:行者123 更新时间:2023-11-29 08:42:32 25 4
gpt4 key购买 nike

enter image description here

如图所示,我有两个 JScrollPanes,A 和 B。我想要实现的是,当光标在 B 上时,您滚动鼠标滚轮:

1)如果B有可滚动的内容,就滚动B。

2)如果B已经滚动到末尾,或者B的内容很少,不可滚动,则滚动A。

现在发生的是鼠标滚轮事件总是被 B 无论如何消耗,所以 A 永远不会被滚动。有什么建议吗?提前致谢。

最佳答案

这是使用 JLayer 的一种可能实现方式:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.LayerUI;
import javax.swing.table.*;
import javax.swing.text.*;

public class WheelOverNestedScrollPaneTest {
private static final String TEXT = "aaa\na\na\na\na\naaaa\na\na\na\naaaa\n";

private JComponent makeUI() {
JTextArea textArea = new JTextArea(TEXT + TEXT + TEXT);
JTable table = new JTable(50, 3);
JTree tree = new JTree();
tree.setVisibleRowCount(5);

JTextPane textPane = new JTextPane();
textPane.setEditable(false);
textPane.setMargin(new Insets(5, 10, 5, 5));
Document doc = textPane.getDocument();
try {
doc.insertString(doc.getLength(), TEXT, null);
textPane.insertComponent(createChildScrollPane(textArea));
doc.insertString(doc.getLength(), "\n", null);
doc.insertString(doc.getLength(), TEXT, null);
textPane.insertComponent(createChildScrollPane(table));
doc.insertString(doc.getLength(), "\n", null);
doc.insertString(doc.getLength(), TEXT, null);
textPane.insertComponent(new JScrollPane(tree));
doc.insertString(doc.getLength(), "\n", null);
doc.insertString(doc.getLength(), TEXT, null);
} catch (BadLocationException ex) {
ex.printStackTrace();
}
return new JLayer<JScrollPane>(
new JScrollPane(textPane), new WheelScrollLayerUI());
}
protected static JScrollPane createChildScrollPane(Component view) {
return new JScrollPane(view) {
@Override public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.height = 120;
return d;
}
};
}
public static void main(String... args) {
EventQueue.invokeLater(() -> {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new WheelOverNestedScrollPaneTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}
}

// http://java-swing-tips.blogspot.jp/2014/09/forward-mouse-wheel-scroll-event-in.html
class WheelScrollLayerUI extends LayerUI<JScrollPane> {
@Override public void installUI(JComponent c) {
super.installUI(c);
if (c instanceof JLayer) {
((JLayer) c).setLayerEventMask(AWTEvent.MOUSE_WHEEL_EVENT_MASK);
}
}
@Override public void uninstallUI(JComponent c) {
if (c instanceof JLayer) {
((JLayer) c).setLayerEventMask(0);
}
super.uninstallUI(c);
}
@Override protected void processMouseWheelEvent(
MouseWheelEvent e, JLayer<? extends JScrollPane> l) {
Component c = e.getComponent();
int dir = e.getWheelRotation();
JScrollPane main = l.getView();
if (c instanceof JScrollPane && !c.equals(main)) {
JScrollPane child = (JScrollPane) c;
BoundedRangeModel m = child.getVerticalScrollBar().getModel();
int extent = m.getExtent();
int minimum = m.getMinimum();
int maximum = m.getMaximum();
int value = m.getValue();
if (value + extent >= maximum && dir > 0 || value <= minimum && dir < 0) {
main.dispatchEvent(SwingUtilities.convertMouseEvent(c, e, main));
}
}
}
}

关于java - 如何使嵌套的 JScrollPanes 正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39033900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com