diff --git a/designer-base/src/main/java/com/fr/design/layout/TableLayoutHelper.java b/designer-base/src/main/java/com/fr/design/layout/TableLayoutHelper.java index e66452402..5e31ba2f7 100644 --- a/designer-base/src/main/java/com/fr/design/layout/TableLayoutHelper.java +++ b/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} - }; - } -} \ No newline at end of file +} diff --git a/designer-base/src/test/java/com/fr/design/gui/storybook/components/TablelayoutStoryBoard.java b/designer-base/src/test/java/com/fr/design/gui/storybook/components/TablelayoutStoryBoard.java new file mode 100644 index 000000000..c99995d60 --- /dev/null +++ b/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; + +/** + * 表格布局展示 + *
+ * TableLayout 来自开源项目 + * TableLayout + * + * @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 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; + } +} diff --git a/designer-base/src/test/resources/com/fr/design/gui/storybook/components/Preferred.gif b/designer-base/src/test/resources/com/fr/design/gui/storybook/components/Preferred.gif new file mode 100644 index 000000000..88e9c2dfa Binary files /dev/null and b/designer-base/src/test/resources/com/fr/design/gui/storybook/components/Preferred.gif differ