【问题标题】:Customizing JTextField自定义 JTextField
【发布时间】:2011-05-15 11:21:03
【问题描述】:

我想知道如何自定义 jtextfield 的 ui,这样我就可以创建圆角矩形边框,而文档不会超出边框。

到目前为止,我想我已经尝试了我能想到的大部分内容,我创建了一个新的 FieldView 类并根据我绘制圆角矩形的自定义边框更改了绘制方法中的形状,这是我唯一的方法设法摆脱白色文本字段文档/视图是将其设置为不透明,但我认为应该有另一种方法而不设置不透明值。

您是否有任何自定义 jtextfield 的 laf 的经验,请回信,我什至没有运气读过 Core Swing 高级书籍,如果您尝试使用 google 搜索,请告诉我搜索短语,因为我尝试使用类似关键字“样式”、“定制”、“ui”、“plaf”、“laf”等等。

我真诚地希望你能给我一个正确的方向,我希望没有人会因此而引发一场激烈的战争,我真的用尽了我能想到的所有资源。

真诚的问候。

【问题讨论】:

  • @user616693:您想定制一个具体的 JTextFile,还是想让您的所有组件看起来更好?在这种情况下,请尝试使用其他 Look&Feel,例如 NimbusSeaGlassSubstance
  • 我想自定义一个具体的 jtextfields 大小并添加一个圆形边框,而视图或文档不可见,并且 nimbus、Seaglass 或实质都没有为我提供一个圆角矩形 jtextfield 至少不是我所能提供的阅读原文
  • 您是否尝试过实现自己的Border 并将其设置为JTextField?如果可行,那将是最简单的解决方案。
  • 确实有,但最终会出现“丑陋”的文档/视图背景(在我的情况下,白色为正常/常规 texfields),并将不透明设置为 false 将呈现文本字段,但没有背景,我正在寻找可以让我剪辑视图或背景以进行四舍五入并正常返回的函数或方法
  • 在旁注中,我必须说您的用户响应速度非常快。谢谢

标签: java swing user-interface look-and-feel


【解决方案1】:

我昨天想解决几乎同样的问题,我从你的想法中得到了一些启发,我终于找到了解决方案。

  1. 要在 JTextField 的边框内制作文档,可以使用

javax.swing.border.EmptyBorder.EmptyBorder(Insets borderInsets)

2.为了避免JTextField的四个角出现空白,可以使用

g2d.setStroke(new BasicStroke(12));

在绘制圆角矩形之前。笔画的宽度根据您的需求而定,使其宽度足以覆盖角落的空间。

这是代码:

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.AbstractBorder;
import javax.swing.border.EmptyBorder;


public class JTextFieldTest {
    JTextField textField;
    boolean activate = false;

    public void createUI(){
        JFrame frame = new JFrame("Test JTextField");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(true);

        MainPanel mainPanel = new MainPanel();
        mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
        frame.add(mainPanel,BorderLayout.CENTER);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        JTextFieldTest jTextFieldTest = new JTextFieldTest();
        jTextFieldTest.createUI();
    }

    public void setActivate(boolean activate){
        this.activate = activate;
    }

    @SuppressWarnings("serial")
    class MainPanel extends JPanel{
        public MainPanel(){

            textField = new JTextField("Please input:");
            Font fieldFont = new Font("Arial", Font.PLAIN, 20);
            textField.setFont(fieldFont);
            textField.setBackground(Color.white);
            textField.setForeground(Color.gray.brighter());
            textField.setColumns(30);
            textField.setBorder(BorderFactory.createCompoundBorder(
                    new CustomeBorder(), 
                    new EmptyBorder(new Insets(15, 25, 15, 25))));
            textField.addActionListener(new FieldListener());
            textField.addMouseListener(new FieldMouseListener());


            add(textField,BorderLayout.CENTER);
            setBackground(Color.blue);
            setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        }
    }

    @SuppressWarnings("serial")
    class CustomeBorder extends AbstractBorder{
        @Override
        public void paintBorder(Component c, Graphics g, int x, int y,
                int width, int height) {
            // TODO Auto-generated method stubs
            super.paintBorder(c, g, x, y, width, height);
            Graphics2D g2d = (Graphics2D)g;
            g2d.setStroke(new BasicStroke(12));
            g2d.setColor(Color.blue);
            g2d.drawRoundRect(x, y, width - 1, height - 1, 25, 25);
        }   
    }

    class FieldListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            System.out.println(textField.getText());
        }

    }

    class FieldMouseListener implements MouseListener{
        @Override
        public void mouseClicked(MouseEvent e) {
            // TODO Auto-generated method stub
            if(activate == false){
                textField.setText("");
            }
            activate = true;
            textField.setForeground(Color.black);
        }

        @Override
        public void mousePressed(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseReleased(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseEntered(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseExited(MouseEvent e) {
            // TODO Auto-generated method stub

        }
    }
}

效果如下:

更多详情可以浏览How to make a round rectangle JTextField

【讨论】:

    【解决方案2】:

    您应该可以使用 Swing 边框来做到这一点。我很久以前在这里发布了一些关于如何做圆角边框的代码 - 也许你可以调整它: http://weblogs.java.net/blog/timboudreau/archive/2005/02/jnn_just_got_pr.html

    【讨论】:

    • 感谢 Tim Boudreau 的回答,您的代码非常有趣,我会研究它。我找到了另一种方法,但它是一个丑陋的 hack,我让我的文本字段透明,自定义了一个 JPanel 绘制方法并将两者都添加到一个框架中,但我认为你的方法更面向未来和面向对象的方式。
    【解决方案3】:

    如果您想自定义单个组件,实际上可以在任何组件中执行此操作。 请查看本教程:http://www.eecchhoo.wordpress.com/2012/11/05/screencast-swingmakeover-extreme-java-gui-programming

    它包含一个简短的简介和一个下载视频教程的链接。仅供参考,这些视频是印度尼西亚语,所以如果您在执行该步骤时遇到问题,还有另一个链接可以下载他用来创建教程的项目。

    如果您有任何问题,请告诉我。我希望这个链接会有所帮助

    【讨论】:

      猜你喜欢
      • 2016-07-09
      • 2022-01-21
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 2012-10-18
      • 2013-09-07
      相关资源
      最近更新 更多