【问题标题】:JTextArea border in java swingjava swing中的JTextArea边框
【发布时间】:2017-07-30 03:32:55
【问题描述】:

我是 java 新手,使用 java 创建 UI 小部件,并为此创建了以下类。但是为了给 textarea 添加边框,我知道我必须使用borderfactory 类。但是因为我有单独的 JFrame 和 JTextArea 类,所以我做不到。有什么帮助吗?

import javax.swing.*;
import java.awt.*;
import javax.swing.BorderFactory;

    public class UIFactory {

        //Border border = BorderFactory.createLineBorder(Color.BLACK);
        public JButton newButton(int posx, int posy, int buttonWidth, int buttonHeight) {
            JButton b = new JButton("Test");
            b.setBounds(posx, posy, buttonWidth, buttonHeight);
            return b;
        }

        public JFrame newFrame(int width, int height) {
            JFrame f = new JFrame();
            f.setSize(width, height);
            f.setLayout(null);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            return f;
        }

        public JTextArea newTextArea(int xpos, int ypos, int twidth, int theight) {
            JTextArea t = new JTextArea(300,300);
            JScrollPane sp = new JScrollPane(t);            
            t.setBounds(xpos, ypos, twidth, theight);
            t.setBackground(Color.orange);  
            t.setForeground(Color.black); 
         //   t.setBorder(BorderFactory.createCompoundBorder(border,BorderFactory.createEmptyBorder(10, 10, 10, 10)));            
            return t;
        }

}

还有我的主程序

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);
    }
}

【问题讨论】:

  • 避免使用null 布局,像素完美的布局是现代用户界面设计中的一种错觉。影响组件单个尺寸的因素太多,您无法控制。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正。
  • 我的“个人”建议是让newTextArea 接受Border 的实例作为其参数之一

标签: java swing jtextarea


【解决方案1】:

在 newTextArea 下面试试

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

【讨论】:

  • 线程“main”java.lang.Error 中的异常:未解决的编译问题:无法将边框解析为 MyUI.main(MyUi.java) 中 UIFactory.newTextArea(UIFactory.java:23) 的类型:17)
  • 您似乎错过了导入,您是在使用一些 IDE 或记事本来编写代码吗?
  • 我用的是eclipse ide
  • 你添加了 import javax.swing.border.Border;导入 javax.swing.BorderFactory;
  • 我只添加了 import javax.swing.BorderFactory;现在在添加 import javax.swing.border.Border 之后;有用。谢谢
【解决方案2】:

有几种方法可以实现这一点,您可以在事实之后将边框应用于框架或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 布局,像素完美的布局是现代用户界面设计中的一种错觉。影响组件单个尺寸的因素太多,您无法控制。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正

查看Why is it frowned upon to use a null layout in SWING?Laying Out Components Within a Container 了解更多详情

【讨论】:

    猜你喜欢
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多