请先看代码: JTextField jt = new JTextField("你好!");
jl_center.add(jt);
jt.setOpaque(false);
jt.setBorder(
new Border(){
@Override
public boolean isBorderOpaque() {
// TODO Auto-generated method stub
return false;
} @Override
public Insets getBorderInsets(Component c) {
// TODO Auto-generated method stub
return null;
} @Override
public void paintBorder(Component c, Graphics g, int x, int y,
int width, int height) {
// TODO Auto-generated method stub

}

);
就是这一段代码出了错!
我只不过是在setBorder()里写了个内部类,怎么就错了?
setBorder()的参数本来就是Border啊?我查了API,是public void setBorder(Border border)啊,怎么错了呢?
求教!

解决方案 »

  1.   


                @Override
                public Insets getBorderInsets(Component c) {
                    // TODO Auto-generated method stub
                    return null;
                }
    所以,NullPointerException
      

  2.   


    可是,我一写new Border,它自带的跟出所有的这些方法。
    毕竟,本来Border就是接口,是要实现的部分。
    而以上的3个override函数就是自带的,为什么抛出异常?
    怎么解决呢?
      

  3.   


    我这个代码,目的就是想使得JLabel的边框(也就是JLabel的外延)变得透明!
    我找了API,我自己猜用setBorder实现,然后看函数原型是public void setBorder(Border border);其实也没有更多的代码了,上面贴的就是核心了!我就把代码都贴出来吧,请看:
    public class TestJLabel_s_BorderLayout extends JFrame{
    TestJLabel_s_BorderLayout(){
    JLabel jl_top = new JLabel("1 ") ;
    jl_top.setOpaque(true) ;
    jl_top.setBackground(Color.black) ;
    JLabel jl_left = new JLabel(" 2") ;
    jl_left.setOpaque(true) ;
    jl_left.setBackground(Color.blue) ;
    JLabel jl_buttom = new JLabel("3 ") ;
    jl_buttom.setOpaque(true) ;
    jl_buttom.setBackground(Color.cyan) ;
    JLabel jl_right = new JLabel("4 ") ;
    jl_right.setOpaque(true) ;
    jl_right.setBackground(Color.gray) ;
    JLabel jl_center = new JLabel() ;
    jl_center.setOpaque(true) ;
    jl_center.setBackground(Color.red) ;
    jl_center.setLayout(new FlowLayout());
    JTextField jt = new JTextField("你好!");
    jl_center.add(jt);
    jt.setOpaque(false);
    jt.setBorder(
    new Border(){
    @Override
    public boolean isBorderOpaque() {
    // TODO Auto-generated method stub
    return false;
    } @Override
    public Insets getBorderInsets(Component c) {
    // TODO Auto-generated method stub
    return null;
    } @Override
    public void paintBorder(Component c, Graphics g, int x, int y,
    int width, int height) {
    // TODO Auto-generated method stub

    }

    );
    JPanel jp = new JPanel(){
    @Override
    public void setLayout(LayoutManager mgr) {
    // TODO Auto-generated method stub
    mgr = new BorderLayout() ;
    super.setLayout(mgr);
    }
    } ;
    add(jp) ;
    jp.add(jl_top, BorderLayout.NORTH) ;
    jp.add(jl_left, BorderLayout.WEST) ;
    jp.add(jl_buttom, BorderLayout.SOUTH) ;
    jp.add(jl_right, BorderLayout.EAST) ;
    jp.add(jl_center,BorderLayout.CENTER);
    setMinimumSize(new Dimension(350,200));
    setVisible(true) ;
    pack() ;
    addWindowListener(new WindowAdapter(){
    @Override
    public void windowClosing(WindowEvent arg0) {
    // TODO Auto-generated method stub
    arg0.getWindow().dispose() ;
    super.windowClosing(arg0);
    }
    }) ;
    }
    public static void main(String[] args) {
    new TestJLabel_s_BorderLayout() ;
    }
    }红体字就是错误处
      

  4.   

    首先,对你积极实现这样一个透明边框的努力表示肯定!我也正在调试你的程序。
    建议你先用java已有的透明边框类EmptyBorder来完成这个程序。代码如下
    package TestLogin_claP;import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.Insets;
    import java.awt.LayoutManager;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.border.Border;
    import javax.swing.border.EmptyBorder;public class TestJLabel_s_BorderLayout extends JFrame { TestJLabel_s_BorderLayout() {
    JLabel jl_top = new JLabel("1 ");
    jl_top.setOpaque(true);
    jl_top.setBackground(Color.black);
    JLabel jl_left = new JLabel(" 2");
    jl_left.setOpaque(true);
    jl_left.setBackground(Color.blue);
    JLabel jl_buttom = new JLabel("3 ");
    jl_buttom.setOpaque(true);
    jl_buttom.setBackground(Color.cyan);
    JLabel jl_right = new JLabel("4 ");
    jl_right.setOpaque(true);
    jl_right.setBackground(Color.gray);
    JLabel jl_center = new JLabel();
    jl_center.setOpaque(true);
    jl_center.setBackground(Color.red);
    jl_center.setLayout(new FlowLayout());
    JTextField jt = new JTextField("你好!");
    jl_center.add(jt);
    jt.setOpaque(false);
    jt.setBorder(new EmptyBorder(0,0,100,100)); // 这样就行!
    JPanel jp = new JPanel() {
    @Override
    public void setLayout(LayoutManager mgr) {
    // TODO Auto-generated method stub
    mgr = new BorderLayout();
    super.setLayout(mgr);
    }
    };
    add(jp);
    jp.add(jl_top, BorderLayout.NORTH);
    jp.add(jl_left, BorderLayout.WEST);
    jp.add(jl_buttom, BorderLayout.SOUTH);
    jp.add(jl_right, BorderLayout.EAST);
    jp.add(jl_center, BorderLayout.CENTER);
    setMinimumSize(new Dimension(350, 200));
    setVisible(true);
    pack();
    addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent arg0) {
    // TODO Auto-generated method stub
    arg0.getWindow().dispose();
    super.windowClosing(arg0);
    }
    });
    } public static void main(String[] args) {
    new TestJLabel_s_BorderLayout();
    }
    }
      

  5.   

    package TestLogin_claP;import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.Insets;
    import java.awt.LayoutManager;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.border.Border;public class TestJLabel_s_BorderLayout extends JFrame { TestJLabel_s_BorderLayout() {
    JLabel jl_top = new JLabel("1 ");
    jl_top.setOpaque(true);
    jl_top.setBackground(Color.black);
    JLabel jl_left = new JLabel(" 2");
    jl_left.setOpaque(true);
    jl_left.setBackground(Color.blue);
    JLabel jl_buttom = new JLabel("3 ");
    jl_buttom.setOpaque(true);
    jl_buttom.setBackground(Color.cyan);
    JLabel jl_right = new JLabel("4 ");
    jl_right.setOpaque(true);
    jl_right.setBackground(Color.gray);
    JLabel jl_center = new JLabel();
    jl_center.setOpaque(true);
    jl_center.setBackground(Color.red);
    jl_center.setLayout(new FlowLayout());
    JTextField jt = new JTextField("你好!");
    jl_center.add(jt);
    jt.setOpaque(false);
    jt.setBorder(new Border() {
    int thickness = 1; @Override
    public boolean isBorderOpaque() {
    // TODO Auto-generated method stub
    return true;
    } @Override
    public Insets getBorderInsets(Component c) {
    // TODO Auto-generated method stub
    return new Insets(thickness, thickness, thickness, thickness);
    } @Override
    public void paintBorder(Component c, Graphics g, int x, int y,
    int width, int height) {
    // TODO Auto-generated method stub
    g.setColor(Color.red); g.fill3DRect(x, y, width - thickness, thickness, false);
    g.fill3DRect(x, y + thickness, thickness, height - thickness,
    false);
    g.fill3DRect(x + thickness, y + height - thickness, width
    - thickness, thickness, false);
    g.fill3DRect(x + width - thickness, y, thickness, height
    - thickness, false); }
    }); //
    JPanel jp = new JPanel() {
    @Override
    public void setLayout(LayoutManager mgr) {
    // TODO Auto-generated method stub
    mgr = new BorderLayout();
    super.setLayout(mgr);
    }
    };
    add(jp);
    jp.add(jl_top, BorderLayout.NORTH);
    jp.add(jl_left, BorderLayout.WEST);
    jp.add(jl_buttom, BorderLayout.SOUTH);
    jp.add(jl_right, BorderLayout.EAST);
    jp.add(jl_center, BorderLayout.CENTER);
    setMinimumSize(new Dimension(350, 200));
    setVisible(true);
    pack();
    addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent arg0) {
    // TODO Auto-generated method stub
    arg0.getWindow().dispose();
    super.windowClosing(arg0);
    }
    });
    } public static void main(String[] args) {
    new TestJLabel_s_BorderLayout();
    }
    }
    OK,调出来了。
    感谢2楼
      

  6.   


    谢谢你,也谢谢二楼!
    我先调调你的程序,OK了之后结贴给分!
    thanks!
      

  7.   


    初学者再问:我API,那个setBorder是public void setBorder(Border border),可是为什么你可以
    写成jt.setBorder(new EmptyBorder(){...}),这样写参数不就变了?我没反应过来这是为什么?