自定义JTextField

时间:2011-05-15 11:21:04

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

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

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

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

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

真诚的问候。

3 个答案:

答案 0 :(得分:4)

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

  1. 要在JTextField的边框内创建文档,可以使用
  2.   

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

    效果如下:

    enter image description here

    有关详细信息,您可以浏览How to make a round rectangle JTextField

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

如果您有任何问题,请告诉我。我希望链接能够提供帮助