|
|
|
@ -18,6 +18,7 @@ import javax.swing.JLayer;
|
|
|
|
|
import javax.swing.ScrollPaneConstants; |
|
|
|
|
import javax.swing.UIManager; |
|
|
|
|
import javax.swing.JTextArea; |
|
|
|
|
import javax.swing.JScrollBar; |
|
|
|
|
import java.awt.Color; |
|
|
|
|
import java.awt.Component; |
|
|
|
|
import java.awt.Composite; |
|
|
|
@ -517,4 +518,88 @@ public class FineUIUtils {
|
|
|
|
|
DesignerFrame parent = DesignerContext.getDesignerFrame(); |
|
|
|
|
return new Dimension((int) (parent.getWidth() * width),(int) (parent.getHeight() * height)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 处理子面板的滚动事件。 |
|
|
|
|
* 根据滚动情况,判断是否需要将事件传递给父面板,或者由子面板自行处理滚动。 |
|
|
|
|
* |
|
|
|
|
* @param childScrollBar 子面板的滚动条 |
|
|
|
|
* @param parentScrollBar 父面板的滚动条 |
|
|
|
|
* @param scrollAmount 滚动增量,通常是鼠标滚轮的滚动值 |
|
|
|
|
*/ |
|
|
|
|
public static void handleChildScrollEvent(JScrollBar childScrollBar, JScrollBar parentScrollBar, int scrollAmount) { |
|
|
|
|
// 如果子面板的滚动条为空,返回
|
|
|
|
|
if (childScrollBar == null) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
// 如果子面板没有显示滚动条,直接将滚动事件传递给父面板
|
|
|
|
|
if (!childScrollBar.isVisible()) { |
|
|
|
|
propagateScrollToParent(parentScrollBar, scrollAmount); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
// 获取子面板当前的滚动值、最小值、最大值和可见区域的高度
|
|
|
|
|
int currentScrollValue = childScrollBar.getValue(); |
|
|
|
|
int minScrollValue = childScrollBar.getMinimum(); |
|
|
|
|
int maxScrollValue = childScrollBar.getMaximum(); |
|
|
|
|
int visibleAreaHeight = childScrollBar.getVisibleAmount(); |
|
|
|
|
// 如果滚动到顶部或到底部,将事件传递给父面板
|
|
|
|
|
if (isScrolledToTop(currentScrollValue, minScrollValue, scrollAmount) |
|
|
|
|
|| isScrolledToBottom(currentScrollValue, maxScrollValue, visibleAreaHeight, scrollAmount)) { |
|
|
|
|
propagateScrollToParent(parentScrollBar, scrollAmount); |
|
|
|
|
} else { |
|
|
|
|
// 否则由子面板自己处理滚动更新滚动值
|
|
|
|
|
childScrollBar.setValue(currentScrollValue + calculateScrollIncrement(childScrollBar, scrollAmount)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 判断是否滚动到顶部。 |
|
|
|
|
* |
|
|
|
|
* @param currentScrollValue 当前滚动条的位置 |
|
|
|
|
* @param minScrollValue 滚动条的最小值 |
|
|
|
|
* @param scrollAmount 滚动增量 |
|
|
|
|
* @return 如果滚动到顶部,返回 true;否则返回 false |
|
|
|
|
*/ |
|
|
|
|
private static boolean isScrolledToTop(int currentScrollValue, int minScrollValue, int scrollAmount) { |
|
|
|
|
return scrollAmount < 0 && currentScrollValue == minScrollValue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 判断是否滚动到底部。 |
|
|
|
|
* |
|
|
|
|
* @param currentScrollValue 当前滚动条的位置 |
|
|
|
|
* @param maxScrollValue 滚动条的最大值 |
|
|
|
|
* @param visibleAreaHeight 可见区域的高度 |
|
|
|
|
* @param scrollAmount 滚动增量 |
|
|
|
|
* @return 如果滚动到底部,返回 true;否则返回 false |
|
|
|
|
*/ |
|
|
|
|
private static boolean isScrolledToBottom(int currentScrollValue, int maxScrollValue, int visibleAreaHeight, int scrollAmount) { |
|
|
|
|
return scrollAmount > 0 && currentScrollValue == maxScrollValue - visibleAreaHeight; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 将滚动事件传递给父面板,处理父面板的滚动。 |
|
|
|
|
* |
|
|
|
|
* @param parentScrollBar 父面板的滚动条 |
|
|
|
|
* @param scrollAmount 滚动增量 |
|
|
|
|
*/ |
|
|
|
|
private static void propagateScrollToParent(JScrollBar parentScrollBar, int scrollAmount) { |
|
|
|
|
if (parentScrollBar != null) { |
|
|
|
|
// 根据滚动增量计算并更新父面板滚动条的位置
|
|
|
|
|
int scrollIncrement = calculateScrollIncrement(parentScrollBar, scrollAmount); |
|
|
|
|
parentScrollBar.setValue(parentScrollBar.getValue() + scrollIncrement); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 计算滚动增量,基于滚动条的单位增量和滚动的数量,UIScrollPane中设置的30 |
|
|
|
|
* |
|
|
|
|
* @param scrollBar 滚动条 |
|
|
|
|
* @param scrollAmount 滚动增量 |
|
|
|
|
* @return 计算出的增量值 |
|
|
|
|
*/ |
|
|
|
|
private static int calculateScrollIncrement(JScrollBar scrollBar, int scrollAmount) { |
|
|
|
|
// 获取滚动条的单位增量,并计算实际的滚动增量
|
|
|
|
|
return scrollAmount * scrollBar.getUnitIncrement(1); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|