2017-03-09 1234 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更多细节