forked from demo/example
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
4.0 KiB
105 lines
4.0 KiB
// 导出打印单选按钮及复选框 |
|
package com.fr.function; |
|
|
|
import com.fr.base.AbstractPainter; |
|
import com.fr.base.BaseUtils; |
|
import com.fr.base.GraphHelper; |
|
import com.fr.base.Style; |
|
import com.fr.general.FArray; |
|
import com.fr.general.FRFont; |
|
import com.fr.script.AbstractFunction; |
|
import com.fr.stable.Primitive; |
|
import com.fr.stable.StringUtils; |
|
|
|
import java.awt.Color; |
|
import java.awt.FontMetrics; |
|
import java.awt.Graphics; |
|
import java.awt.Graphics2D; |
|
import java.awt.Image; |
|
|
|
public class Widget2Image extends AbstractFunction { |
|
public Object run(Object[] args) { |
|
if (args.length < 3) |
|
return Primitive.NULL; |
|
// 第一个参数:控件类型,不区分大小写 |
|
String type = args[0].toString().toLowerCase(); |
|
if (!("checkbox".equals(type) || "radiobutton".equals(type))) |
|
return Primitive.ERROR_VALUE; |
|
// 第二个参数:控件按钮个数 |
|
int num = Integer.parseInt(args[1].toString()); |
|
// 第三个参数:按钮组的值,哪些被选中 |
|
String selection = args[2].toString(); |
|
// 第四个参数:可选参数,按钮组对应的显示值数组 |
|
FArray textArray = new FArray(); |
|
if (args.length == 4 && args[3] instanceof FArray) { |
|
textArray = (FArray) args[3]; |
|
} |
|
return new WidgetPaint(type, num, selection, textArray); |
|
} |
|
|
|
public static class WidgetPaint extends AbstractPainter { |
|
public static String CHECK_ON = "/com/fr/web/images/checkon.gif"; |
|
public static String CHECK_OFF = "/com/fr/web/images/checkoff.gif"; |
|
public static String RADIO_ON = "/com/fr/web/images/radioon.gif"; |
|
public static String RADIO_OFF = "/com/fr/web/images/radiooff.gif"; |
|
public static FRFont DEFUALT_FONT = FRFont.getInstance(); |
|
public static FontMetrics FontMetrics = GraphHelper |
|
.getFontMetrics(DEFUALT_FONT); |
|
private String type; |
|
private int num; |
|
private String selection; |
|
private FArray textArray; |
|
|
|
{ |
|
DEFUALT_FONT = DEFUALT_FONT.applyForeground(Color.BLACK); |
|
} |
|
|
|
public WidgetPaint(String type, int num, String selection, |
|
FArray textArray) { |
|
this.type = type; |
|
this.num = num; |
|
this.selection = selection; |
|
this.textArray = textArray; |
|
} |
|
|
|
private String resolveText(int i) { |
|
if (i < this.textArray.length()) { |
|
return this.textArray.elementAt(i).toString(); |
|
} |
|
return StringUtils.EMPTY; |
|
} |
|
|
|
public void paint(Graphics g, int width, int height, int resolution, |
|
Style style) { |
|
String OFF = CHECK_OFF; |
|
String ON = CHECK_ON; |
|
if ("radiobutton".equals(type)) { |
|
OFF = RADIO_OFF; |
|
ON = RADIO_ON; |
|
} |
|
Image[] checkOFFON = {BaseUtils.readImage(OFF), |
|
BaseUtils.readImage(ON)}; |
|
int[] imgWidths = {checkOFFON[0].getWidth(null), |
|
checkOFFON[1].getWidth(null)}; |
|
int[] imgHeights = {checkOFFON[0].getHeight(null), |
|
checkOFFON[1].getHeight(null)}; |
|
Graphics2D g2d = (Graphics2D) g; |
|
g2d.setFont(FRFont.getInstance()); |
|
g2d.setPaint(Color.BLACK); |
|
int x = 2; |
|
int y = (height - imgHeights[0]) / 2; |
|
String select = selection; |
|
for (int i = 0; i < num; i++) { |
|
int bit = Integer.parseInt(select.substring(i, i + 1)); |
|
g2d.drawImage(checkOFFON[bit], x, y, imgWidths[bit], |
|
imgHeights[bit], null); |
|
x += imgWidths[bit] + 2; |
|
String text = resolveText(i); |
|
g2d.setBackground(Color.BLACK); |
|
g2d.drawString(text, (float) x, (float) (y + FontMetrics |
|
.getAscent())); |
|
x += FontMetrics.stringWidth(text) + 2; |
|
} |
|
} |
|
} |
|
} |