有一對夫婦的方式,你可能能夠做到這一點,你可以只需將邊界後的邊界應用於框架或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