有一对夫妇的方式,你可能能够做到这一点,你可以只需将边界后的边界应用于框架或JTextArea
或者您可以支持根据您的需求
根据您的需要将Border
的值转换为任意方法我的选择是考虑使用构建器模式,这将允许您提供您感兴趣的属性并做出最终结果。
由于许多属性都是组件之间共享,我会忍不住用抽象实现
public abstract class ComponentBuilder<B extends ComponentBuilder<B, T>, T extends JComponent> {
public static final String BORDER = "border";
public static final String FOREGROUND = "foreground";
public static final String BACKGROUND = "background";
private Map<String, Object> 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> O get(String key, Class<O> 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非常灵活
现在,您可以包含更多的属性,例如字体,但让我们坚持一个基本示例。
接下来,我们需要一个文本区域生成器生成一个文本,我们希望它
public class TextAreaBuilder extends ComponentBuilder<TextAreaBuilder, JTextArea> {
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设计。影响组件的个体大小的因素太多,其中没有一个可以控制。摇摆设计为核心与布局管理工作,丢弃这些会导致没有问题,问题是,你将花费更多的时间,试图结束整顿
看一看Why is it frowned upon to use a null layout in SWING?和Laying Out Components Within a Container更多细节
避免使用'null'布局,像素完美的布局是现代UI设计中的幻想。影响组件的个体大小的因素太多,其中没有一个可以控制。 Swing旨在与布局经理一起工作,放弃这些将导致无法结束的问题和问题,您将花费越来越多的时间来尝试纠正。 – MadProgrammer
看看[为什么在SWING中使用空布局会皱起眉头?](http:// stackoverflow。com/questions/6592468/why-it-it-it-it-frrow-on-to-use-a-null-layout-in-swing)和[在容器中放置组件](http://docs.oracle.com/ javase/tutorial/uiswing/layout/index.html) – MadProgrammer
我的“个人”建议是让'newTextArea'接受一个Border实例作为它的一个参数 – MadProgrammer