Browse Source

Pull request #5407: REPORT-57181 【FRM布局推荐】组件复用-自动间距目前么有把小数处理成整数

Merge in DESIGN/design from ~FANGLEI/design10.0:feature/10.0 to feature/10.0

* commit '2018937ad70336f88d8efda4b55afc1570e325c2':
  REPORT-57181 【FRM布局推荐】组件复用-自动间距目前么有把小数处理成整数
feature/10.0
fanglei 3 years ago
parent
commit
82afebccf9
  1. 66
      designer-form/src/main/java/com/fr/design/mainframe/MultiSelectionArrangement.java

66
designer-form/src/main/java/com/fr/design/mainframe/MultiSelectionArrangement.java

@ -70,22 +70,22 @@ public class MultiSelectionArrangement {
// 水平分布,自动,间距由selectedCreators和border共同计算而来
public void horizontalAutoDistribution() {
sortHorizontal();
int gap = calculateHorizontalGap();
horizontalDistribution(gap);
int[] gaps = calculateHorizontalGaps();
horizontalDistribution(gaps);
}
// 水平分布,手动,传入一个间距,排列selectedCreators
public void horizontalManualDistribution(int gap) {
sortHorizontal();
reSizeRecByHorizontal(gap);
horizontalDistribution(gap);
horizontalDistribution(fillGaps(gap, selectedCreators.size() - 1));
}
private void horizontalDistribution(int gap) {
private void horizontalDistribution(int[] gaps) {
for (int i = 1; i < selectedCreators.size() - 1; i++) {
XCreator creator = selectedCreators.get(i);
XCreator preCreator = selectedCreators.get(i - 1);
creator.setLocation(preCreator.getX() + preCreator.getWidth() + gap, creator.getY());
creator.setLocation(preCreator.getX() + preCreator.getWidth() + gaps[i - 1], creator.getY());
}
update();
}
@ -133,34 +133,35 @@ public class MultiSelectionArrangement {
}
// 计算selectedCreators的均分间距
private int calculateHorizontalGap() {
private int[] calculateHorizontalGaps() {
int sum = 0;
for (XCreator creator : selectedCreators) {
sum += creator.getWidth();
}
int gapCount = selectedCreators.size() - 1;
XCreator head = selectedCreators.get(0);
XCreator tail = selectedCreators.get(selectedCreators.size() - 1);
XCreator tail = selectedCreators.get(gapCount);
int distanceBetweenHeadAndTailCreators = Math.abs(head.getX() - tail.getX()) + tail.getWidth();
return (distanceBetweenHeadAndTailCreators - sum) / (selectedCreators.size() - 1);
return calculateIntegerGaps(distanceBetweenHeadAndTailCreators - sum, gapCount);
}
public void verticalAutoDistribution() {
sortVertical();
int gap = calculateVerticalGap();
verticalDistribution(gap);
int[] gaps = calculateVerticalGaps();
verticalDistribution(gaps);
}
public void verticalManualDistribution(int gap) {
sortVertical();
reSizeRecByVertical(gap);
verticalDistribution(gap);
verticalDistribution(fillGaps(gap, selectedCreators.size() - 1));
}
private void verticalDistribution(int gap) {
private void verticalDistribution(int[] gaps) {
for (int i = 1; i < selectedCreators.size() - 1; i++) {
XCreator creator = selectedCreators.get(i);
XCreator preCreator = selectedCreators.get(i - 1);
creator.setLocation(creator.getX(), preCreator.getY() + preCreator.getHeight() + gap);
creator.setLocation(creator.getX(), preCreator.getY() + preCreator.getHeight() + gaps[i - 1]);
}
update();
}
@ -207,15 +208,48 @@ public class MultiSelectionArrangement {
});
}
private int calculateVerticalGap() {
private int[] calculateVerticalGaps() {
int sum = 0;
for (XCreator creator : selectedCreators) {
sum += creator.getHeight();
}
int gapCount = selectedCreators.size() - 1;
XCreator head = selectedCreators.get(0);
XCreator tail = selectedCreators.get(selectedCreators.size() - 1);
XCreator tail = selectedCreators.get(gapCount);
int distanceBetweenHeadAndTailCreators = Math.abs(head.getY() - tail.getY()) + tail.getHeight();
return (distanceBetweenHeadAndTailCreators - sum) / (selectedCreators.size() - 1);
return calculateIntegerGaps(distanceBetweenHeadAndTailCreators - sum, gapCount);
}
private int[] calculateIntegerGaps(int gapTotalSize, int gapCount) {
int finalGap[] = new int[gapCount];
// gapTotalSize: 原先的所有未取整的gap的总和,是一个整数
int intGap = Math.round((float) gapTotalSize / gapCount);
// 把所有取整的gap求和,得到的整数gap
int intTotalSize = intGap * (gapCount);
// 求差,可以知道总误差
int difference = intTotalSize - gapTotalSize;
// 遍历,由于取整是四舍五入得到的,取整后每个gap和取整前的gap最多相差0.5,故difference绝对值小于gapCount的
for (int i = 0; i < gapCount; i++) {
if (i < Math.abs(difference)) {
if (difference < 0) {
// 说明取整后gap总误差小于取整前总gap,一个个加1补上
finalGap[i] = intGap + 1;
} else {
// 说明取整后gap总误差大于取整前总gap,一个个减1去掉
finalGap[i] = intGap - 1;
}
} else {
finalGap[i] = intGap;
}
}
return finalGap;
}
// 创建用gap填满一个size大小的数组
private int[] fillGaps(int gap, int size) {
int[] gaps = new int[size];
Arrays.fill(gaps, gap);
return gaps;
}
private void update() {

Loading…
Cancel
Save