自定义JTextField

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

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

你有任何定制jtextfield laf的经验,请回信,我甚至没有运气阅读Core Swing高级书籍,如果你尝试用谷歌搜索,请让我知道搜索短语,因为我试过像“造型”这样的关键词,“定制”,“ui”,“plaf”,“laf”等等。

我真诚地希望你能给我一个正确方向的推动,我希望没有人会因此而制造出一个火焰战争,我真正使用了我能想到的所有资源。

真诚的问候。

我想昨天解决几乎相同的问题,我的想法得到了一些灵​​感,我终于找到了解决方案。

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

这是效果:

在此处输入图像描述

有关更多详细信息,您可以浏览如何制作圆角矩形JTextField

您应该可以使用Swing边框执行此操作。 我很久以前就发布了一些关于如何做圆形边框的代码 – 也许你可以改编它: http : //weblogs.java.net/blog/timboudreau/archive/2005/02/jnn_just_got_pr.html

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

它包含一个简短的简介和下载video教程的链接。 仅供参考,video采用印尼语言,因此如果您有问题要遵循这一步骤,还有另一个链接可下载用于创建教程的项目。

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