【问题标题】:a custom JtextField [duplicate]自定义 JtextField [重复]
【发布时间】:2016-07-09 19:48:59
【问题描述】:

我正在尝试创建一些带有图像和提示的更好看的 JTextField。我按照这个教程https://gmigdos.wordpress.com/2010/03/30/java-a-custom-jtextfield-for-searching/

我得到的错误是这样的:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.jd.swing.custom.component.jtextfield.JIconTextField.paintComponent(JIconTextField.java:53)
at com.jd.swing.custom.component.jtextfield.JSearchTextField.paintComponent(JSearchTextField.java:49)
at javax.swing.JComponent.paint(JComponent.java:1054)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:585)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5228)
at javax.swing.RepaintManager.paint(RepaintManager.java:1209)
at javax.swing.JComponent.paint(JComponent.java:1040)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:78)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115)
at java.awt.Container.paint(Container.java:1967)
at java.awt.Window.paint(Window.java:3877)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:781)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677)
at javax.swing.RepaintManager.access$700(RepaintManager.java:59)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:701)
at java.awt.EventQueue.access$000(EventQueue.java:102)
at java.awt.EventQueue$3.run(EventQueue.java:662)
at java.awt.EventQueue$3.run(EventQueue.java:660)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:671)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

JIconTextField.java

public class JIconTextField extends JTextField{

    /**
     * 
     */
    private static final long serialVersionUID = -8242515712056236296L;
    private Icon icon;
    private Insets dummyInsets;

    public JIconTextField(){
        super();
        this.icon = null;

        Border border = UIManager.getBorder("TextField.border");
        JTextField dummy = new JTextField();
        if(border!=null){
            this.dummyInsets = border.getBorderInsets(dummy);
        }else{
            this.dummyInsets = null;
        }
    }

    public void setIcon(Icon icon){
        this.icon = icon;
    }

    public Icon getIcon(){
        return this.icon;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        int textX = 2;

        if(this.icon!=null){
            int iconWidth = icon.getIconWidth();
            int iconHeight = icon.getIconHeight();
            int x = dummyInsets.left -5;//this is our icon's x
            textX = x+iconWidth+2; //this is the x where text should start
            int y = (this.getHeight() - iconHeight)/2;
            icon.paintIcon(this, g, x, y);
        }
        setMargin(new Insets(2, textX, 2, 2));
    }
}

【问题讨论】:

  • 回溯告诉您,您在 JIconTextField 类的第 49 或 53 行取消引用空值。您发布的代码不是该类的全部代码,所以我不知道那是哪一行,但您的代码需要考虑“dummyInsets”为空的可能性。
  • 您可能会从this thread 中找到有关同一主题的有用信息。
  • 根据这个线程,我得到了同样的错误 NullPointerException line 36 (this.dummyInsets = border.getBorderInsets(dummy);)
  • “我正在尝试创建一些更好看的 JTextFields” PLAF!

标签: java swing jtextfield jpasswordfield


【解决方案1】:

我试过了

 if(this.icon!=null){
        int iconWidth = icon.getIconWidth();
        int iconHeight = icon.getIconHeight();
        int x = (dummyInsets==null) ? 0 : dummyInsets.left - 5;
        textX = x+iconWidth+2;
        int y = (this.getHeight() - iconHeight)/2;
        icon.paintIcon(this, g, x, y);
    }

成功了

【讨论】:

  • 在另一个答案中查看我关于支票应该在哪里的评论。
  • 这不应该是答案,而是对您帖子的编辑
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 2019-10-01
  • 1970-01-01
相关资源
最近更新 更多