Browse Source

REPORT-99485 TableLayoutHelper 适配DPI缩放

newui
vito 4 months ago
parent
commit
7ed5e6545d
  1. 108
      designer-base/src/main/java/com/fr/design/layout/TableLayoutHelper.java
  2. 169
      designer-base/src/test/java/com/fr/design/gui/storybook/components/TablelayoutStoryBoard.java
  3. BIN
      designer-base/src/test/resources/com/fr/design/gui/storybook/components/Preferred.gif

108
designer-base/src/main/java/com/fr/design/layout/TableLayoutHelper.java

@ -1,16 +1,13 @@
package com.fr.design.layout;
import com.fine.theme.utils.FineUIScale;
import com.fr.design.constants.LayoutConstants;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.i18n.Toolkit;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.stable.StringUtils;
import javax.swing.*;
import java.awt.*;
import javax.swing.JPanel;
import java.awt.Component;
import java.awt.Container;
public class TableLayoutHelper {
@ -18,8 +15,6 @@ public class TableLayoutHelper {
public static final int FILL_LASTCOLUMN = 1;
public static final int FILL_LASTROW = 2;
public static final int FILL_LASTCOL_AND_ROW = 3;
private static final int FIVE = 5;
private static final int TEN = 10;
private TableLayoutHelper() {
}
@ -287,6 +282,8 @@ public class TableLayoutHelper {
layoutRowSize[i * 2 + 1] = rowSize[i];
}
scaleIfNeed(layoutRowSize, layoutColumnSize);
layoutSize[0] = layoutColumnSize;
layoutSize[1] = layoutRowSize;
@ -296,6 +293,28 @@ public class TableLayoutHelper {
return resultPane;
}
/**
* 缩放必要的尺寸
* 尺寸参数有三种小于0有三种预定义类型0~1之间为比例参数大于等于1为普通px
* 这里只对px进行缩放处理
* 注意当前只对从TableLayoutHelper创建的TableLayout进行尺寸缩放
*/
private static void scaleIfNeed(double[] layoutRowSize, double[] layoutColumnSize) {
for (int i = 0; i < layoutRowSize.length; i++) {
double size = layoutRowSize[i];
if (size >= 1.0) {
layoutRowSize[i] = FineUIScale.scale((float) size);
}
}
for (int i = 0; i < layoutColumnSize.length; i++) {
double size = layoutColumnSize[i];
if (size >= 1.0) {
layoutColumnSize[i] = FineUIScale.scale((float) size);
}
}
}
/**
* 创建具有不同垂直间距的TableLayout面板
*
@ -363,73 +382,4 @@ public class TableLayoutHelper {
};
return createTableLayoutPane(comp, row, column);
}
public static void main(String[] args) {
JFrame jf = new JFrame("test");
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel content = (JPanel) jf.getContentPane();
content.setLayout(new GridLayout(2, 3));
double p = TableLayout.PREFERRED;
double f = TableLayout.FILL;
JPanel jp1 = TableLayoutHelper.createTableLayoutPane(createTestComponents("jp1"), TableLayoutHelper.FILL_NONE);
JPanel jp2 = TableLayoutHelper.createGapTableLayoutPane(createTestComponents("jp2"),
TableLayoutHelper.FILL_LASTCOL_AND_ROW, (double)2 * TEN, (double)2 * TEN);
JPanel jp3 = TableLayoutHelper.createGapTableLayoutPane(createTestComponents("jp3"),
new double[]{f, p, f, p}, new double[]{f, f}, 4, 4);
JPanel jp4 = TableLayoutHelper.createGapTableLayoutPane(createTestComponents("jp4"),
new double[]{p, FIVE * TEN, p, p, p, p}, new double[]{p, f}, new int[][]{{1, 3}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, 1, FIVE);
JPanel jp5 = TableLayoutHelper.createDiffVGapTableLayoutPane(createTestComponents("jp5"),
new double[]{p, p, p, p, p}, new double[]{p, f}, 4, new double[]{4, 8, 14, 4});
JPanel jp6 = new JPanel();
jp1.setBorder(BorderFactory.createLineBorder(Color.red));
jp2.setBorder(BorderFactory.createLineBorder(Color.red));
jp3.setBorder(BorderFactory.createLineBorder(Color.red));
jp4.setBorder(BorderFactory.createLineBorder(Color.red));
jp5.setBorder(BorderFactory.createLineBorder(Color.red));
jp6.setBorder(BorderFactory.createLineBorder(Color.red));
content.add(jp1);
content.add(jp2);
content.add(jp3);
content.add(jp4);
content.add(jp5);
content.add(jp6);
GUICoreUtils.centerWindow(jf);
jf.setSize(900, 600);
jf.setVisible(true);
}
private static Component[][] createTestComponents(String name) {
UILabel label1 = new UILabel(name + "laaaable1");
UILabel label2 = new UILabel(name + "lable2");
UILabel label3 = new UILabel(name + "lable3");
UILabel label4 = new UILabel(name + "lable4");
UILabel label5 = new UILabel(name + "lable5");
UIButton button1 = new UIButton(name + "button1");
UIButton button2 = new UIButton(name + "button2");
label1.setSize(label1.getPreferredSize());
label1.setBorder(BorderFactory.createLineBorder(Color.blue));
label2.setSize(label2.getPreferredSize());
label2.setBorder(BorderFactory.createLineBorder(Color.blue));
label3.setSize(label3.getPreferredSize());
label3.setBorder(BorderFactory.createLineBorder(Color.blue));
label4.setSize(label4.getPreferredSize());
label4.setBorder(BorderFactory.createLineBorder(Color.blue));
label5.setSize(label5.getPreferredSize());
label5.setBorder(BorderFactory.createLineBorder(Color.blue));
button1.setSize(button1.getPreferredSize());
button2.setSize(button2.getPreferredSize());
button1.setBackground(Color.darkGray);
button2.setBackground(Color.darkGray);
return new Component[][]{
new Component[]{label1, button1},
new Component[]{label2, null},
new Component[]{label3},
new Component[]{null, label4},
new Component[]{button2, label5}
};
}
}
}

169
designer-base/src/test/java/com/fr/design/gui/storybook/components/TablelayoutStoryBoard.java

@ -0,0 +1,169 @@
package com.fr.design.gui.storybook.components;
import com.fine.swing.ui.layout.Layouts;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.gui.storybook.StoryBoard;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import org.jetbrains.annotations.NotNull;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Component;
import static com.fine.swing.ui.layout.Layouts.cell;
import static com.fine.swing.ui.layout.Layouts.row;
import static com.fr.design.layout.TableLayoutHelper.createDiffVGapTableLayoutPane;
import static com.fr.design.layout.TableLayoutHelper.createGapTableLayoutPane;
import static com.fr.design.layout.TableLayoutHelper.createTableLayoutPane;
/**
* 表格布局展示
* <br/>
* TableLayout 来自开源项目
* <a href="https://www.clearthought.info/sun/products/jfc/tsc/articles/tablelayout/index.html">TableLayout</a>
*
* @author vito
* @since 11.0
* Created on 2024/1/31
*/
public class TablelayoutStoryBoard extends StoryBoard {
private static final double P = TableLayout.PREFERRED;
private static final double F = TableLayout.FILL;
public TablelayoutStoryBoard() {
super("Tablelayout");
add(
cell(new UILabel("简单布局")).with(this::h3),
layout1(),
cell(new UILabel("TableLayoutHelper 快速创建")).with(this::h3),
row(
cell(createTableLayoutPane(createTestComponents("jp1"), TableLayoutHelper.FILL_NONE))
.with(it -> it.setBorder(BorderFactory.createLineBorder(Color.red))).weight(1),
cell(createGapTableLayoutPane(createTestComponents("jp2"),
TableLayoutHelper.FILL_LASTCOL_AND_ROW, 20, 20))
.with(it -> it.setBorder(BorderFactory.createLineBorder(Color.red))).weight(1),
cell(createGapTableLayoutPane(createTestComponents("jp3"),
new double[]{F, P, F, P}, new double[]{F, F}, 4, 4))
.with(it -> it.setBorder(BorderFactory.createLineBorder(Color.red))).weight(1)
),
row(
cell(createGapTableLayoutPane(createTestComponents("jp4"),
new double[]{P, 50, P, P, P, P}, new double[]{P, F}, new int[][]{{1, 3}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, 1, 5))
.with(it -> it.setBorder(BorderFactory.createLineBorder(Color.red))).weight(1),
cell(createDiffVGapTableLayoutPane(createTestComponents("jp5"),
new double[]{P, P, P, P, P}, new double[]{P, F}, 4, new double[]{4, 8, 14, 4}))
.with(it -> it.setBorder(BorderFactory.createLineBorder(Color.red))).weight(1)
)
);
}
private static Component[][] createTestComponents(String name) {
UILabel label1 = new UILabel(name + "laaaable1");
UILabel label2 = new UILabel(name + "lable2");
UILabel label3 = new UILabel(name + "lable3");
UILabel label4 = new UILabel(name + "lable4");
UILabel label5 = new UILabel(name + "lable5");
UIButton button1 = new UIButton(name + "button1");
UIButton button2 = new UIButton(name + "button2");
label1.setSize(label1.getPreferredSize());
label1.setBorder(BorderFactory.createLineBorder(Color.blue));
label2.setSize(label2.getPreferredSize());
label2.setBorder(BorderFactory.createLineBorder(Color.blue));
label3.setSize(label3.getPreferredSize());
label3.setBorder(BorderFactory.createLineBorder(Color.blue));
label4.setSize(label4.getPreferredSize());
label4.setBorder(BorderFactory.createLineBorder(Color.blue));
label5.setSize(label5.getPreferredSize());
label5.setBorder(BorderFactory.createLineBorder(Color.blue));
button1.setSize(button1.getPreferredSize());
button2.setSize(button2.getPreferredSize());
return new Component[][]{
new Component[]{label1, button1},
new Component[]{label2, null},
new Component[]{label3},
new Component[]{null, label4},
new Component[]{button2, label5}
};
}
/**
* 图示 {@link /com/fr/design/gui/storybook/components/Preferred.gif}
*/
private Layouts.Cell<JPanel> layout1() {
JPanel pane = getTableLayoutPanel();
// Create all controls
UILabel labelName = new UILabel("Name");
UILabel labelAddress = new UILabel("Address");
UILabel labelCity = new UILabel("City");
UILabel labelState = new UILabel("State");
UILabel labelZip = new UILabel("Zip");
UITextField textfieldName = new UITextField(10);
UITextField textfieldAddress = new UITextField(20);
UITextField textfieldCity = new UITextField(10);
UITextField textfieldState = new UITextField(2);
UITextField textfieldZip = new UITextField(5);
UIButton buttonOk = new UIButton("OK");
UIButton buttonCancel = new UIButton("Cancel");
JPanel panelButton = new JPanel();
panelButton.add(buttonOk);
panelButton.add(buttonCancel);
// Add all controls
pane.add(labelName, "1, 1, 5, 1");
pane.add(textfieldName, "1, 3, 5, 3");
pane.add(labelAddress, "1, 5, 5, 5");
pane.add(textfieldAddress, "1, 7, 5, 7");
pane.add(labelCity, "1, 9");
pane.add(textfieldCity, "1, 11");
pane.add(labelState, "3, 9");
pane.add(textfieldState, "3, 11");
pane.add(labelZip, "5, 9");
pane.add(textfieldZip, "5, 11");
pane.add(panelButton, "1, 13, 5, 13");
return cell(pane);
}
@NotNull
private static JPanel getTableLayoutPanel() {
JPanel pane = new JPanel();
// b - border
// f - FILL
// p - PREFERRED
// vs - vertical space between labels and text fields
// vg - vertical gap between form elements
// hg - horizontal gap between form elements
double b = 10;
double f = TableLayout.FILL;
double p = TableLayout.PREFERRED;
double vs = 5;
double vg = 10;
double hg = 10;
double[][] size =
{{b, f, hg, p, hg, p, b},
{b, p, vs, p, vg, p, vs, p, vg, p, vs, p, vg, p, b}};
TableLayout layout = new TableLayout(size);
pane.setLayout(layout);
return pane;
}
}

BIN
designer-base/src/test/resources/com/fr/design/gui/storybook/components/Preferred.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Loading…
Cancel
Save