@ -18,6 +18,7 @@ import javax.swing.JLayer;
import javax.swing.ScrollPaneConstants ;
import javax.swing.ScrollPaneConstants ;
import javax.swing.UIManager ;
import javax.swing.UIManager ;
import javax.swing.JTextArea ;
import javax.swing.JTextArea ;
import javax.swing.JScrollBar ;
import java.awt.Color ;
import java.awt.Color ;
import java.awt.Component ;
import java.awt.Component ;
import java.awt.Composite ;
import java.awt.Composite ;
@ -517,4 +518,88 @@ public class FineUIUtils {
DesignerFrame parent = DesignerContext . getDesignerFrame ( ) ;
DesignerFrame parent = DesignerContext . getDesignerFrame ( ) ;
return new Dimension ( ( int ) ( parent . getWidth ( ) * width ) , ( int ) ( parent . getHeight ( ) * height ) ) ;
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 ) ;
}
}
}