2017-03-09 129 views
1

我是java新手,使用java創建UI小部件,併爲其創建了以下類。但爲了添加邊框到textarea我知道我必須使用borderfactory類。但是因爲我有單獨的JFrame和JTextArea類,所以我無法做到這一點。任何幫助?java swing中的JTextArea邊框

​​

和我的主程序

import javax.swing.*; 
import java.awt.*; 
public class MyUI { 
public static void main(String[] args) { 
     UIFactory ui = new UIFactory();  
     JFrame mainf = ui.newFrame(800, 800);   
     mainf.setLocation(400, 400); 

     JButton b2; 
     JButton b3; 


     mainf.add(b2 = ui.newButton(50, 50, 100, 50)); 
     mainf.add(b3 = ui.newButton(50, 100, 100, 50)); 

     JTextArea area; 
     mainf.add(area = ui.newTextArea(170,50,1600,300)); 
     mainf.setVisible(true); 
     mainf.add(area = ui.newTextArea(170,400,1600,300)); 
     mainf.setVisible(true); 
    } 
} 
+1

避免使用'null'佈局,像素完美的佈局是現代UI設計中的幻想。影響組件的個體大小的因素太多,其中沒有一個可以控制。 Swing旨在與佈局經理一起工作,放棄這些將導致無法結束的問題和問題,您將花費越來越多的時間來嘗試糾正。 – MadProgrammer

+1

看看[爲什麼在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

+0

我的「個人」建議是讓'newTextArea'接受一個Border實例作爲它的一個參數 – MadProgrammer

回答

2

下面嘗試newTextArea

Border border = BorderFactory.createLineBorder(Color.BLACK); 
    t.setBorder(BorderFactory.createCompoundBorder(border, 
      BorderFactory.createEmptyBorder(10, 10, 10, 10))); 
+0

當我使用你的代碼時,我得到了以下錯誤 – Rajesh

+0

異常在線程「主要」 java.lang.Error的:未解決的問題,編譯: \t邊界不能解析爲一個類型 \t在UIFactory.newTextArea(UIFactory.java:23) \t在MyUI.main(MyUi .java:17) – Rajesh

+0

它似乎你錯過了進口,你用一些IDE或記事本來編寫代碼? – SAQ

1

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