有几种方法可以实现这一点,你可以将事后的边框应用到框架或JTextArea或者你可以根据你的需要为这两种方法提供Border值
我倾向于考虑使用构建器模式,这将允许您提供您感兴趣的属性并生成最终结果。
因为许多属性是在组件之间共享的,所以我很想从一个抽象的实现开始
public abstract class ComponentBuilder, T extends JComponent> {
public static final String BORDER = "border";
public static final String FOREGROUND = "foreground";
public static final String BACKGROUND = "background";
private Map properties = new HashMap<>();
protected abstract B self();
protected void put(String key, Object value) {
properties.put(key, value);
}
public B withBorder(Border border) {
put(BORDER, border);
return self();
}
public B withForeground(Color color) {
put(FOREGROUND, color);
return self();
}
public B withBackground(Color color) {
put(BACKGROUND, color);
return self();
}
public abstract T build();
public O get(String key, Class type, O defaultValue) {
Object value = properties.get(key);
if (value == null) {
return defaultValue;
} else if (value.getClass().isAssignableFrom(type)) {
return (O)value;
}
return defaultValue;
}
protected Border getBorder() {
return get(BORDER, Border.class, null);
}
protected int getInt(String key, int defaultValue) {
return get(key, int.class, defaultValue);
}
protected Color getColor(String key, Color defaultValue) {
return get(key, Color.class, defaultValue);
}
protected Color getForeground() {
return getColor(FOREGROUND, null);
}
protected Color getBackground() {
return getColor(BACKGROUND, null);
}
}
好吧,不要惊慌,这是一些很棒的通用技巧,但相信我,它使整个API非常灵活
现在,您可以包含更多属性,例如字体,但让我们坚持使用一个基本示例。
接下来,我们需要一个文本区域构建器来按照我们想要的方式构建textarea
public class TextAreaBuilder extends ComponentBuilder {
public static final String ROWS = "rows";
public static final String COLUMNS = "columns";
@Override
protected TextAreaBuilder self() {
return this;
}
public TextAreaBuilder withRows(int rows) {
put(ROWS, rows);
return self();
}
public TextAreaBuilder withColumns(int cols) {
put(COLUMNS, cols);
return self();
}
protected int getRows(int defaultValue) {
return getInt(ROWS, defaultValue);
}
protected int getColumns(int defaultValue) {
return getInt(COLUMNS, defaultValue);
}
@Override
public JTextArea build() {
JTextArea ta = new JTextArea();
ta.setColumns(getColumns(0));
ta.setRows(getRows(0));
ta.setBorder(getBorder());
ta.setForeground(getForeground());
ta.setBackground(getBackground());
return ta;
}
}
然后我们可以简单地使用我们想要使用的属性创建一个新的JTextArea ...
JTextArea ta = new TextAreaBuilder().
withColumns(40).
withRows(20).
withBackground(Color.ORANGE).
withForeground(Color.BLACK).
withBorder(BorderFactory.createLineBorder(Color.RED)).
build();
完成!
现在,如果所有看起来“变得困难”,您可以简单地将当前方法更改为需要Border的实例
public JTextArea newTextArea(int rows, int cols, Border border) {
JTextArea ta = new JTextArea(rows, cols);
ta.setBorder(border);
return ta;
}
避免使用null布局,像素完美布局是现代ui设计中的错觉。 影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的结束,您将花费越来越多的时间来纠正