首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

为啥重绘JButton后加入到一个JPanel中显示就不正常勒呢

2012-09-05 
为什么重绘JButton后加入到一个JPanel中显示就不正常勒呢重绘JButton的代码paintComponent如下:Java codep

为什么重绘JButton后加入到一个JPanel中显示就不正常勒呢
重绘JButton的代码paintComponent如下:

Java code
public void paintComponent(Graphics g) {        Graphics2D g2 = (Graphics2D)g ;         Paint oldPaint = g2.getPaint() ;         if(isEntered){        if (getModel().isArmed()) {            g2.setColor(bacClick);                    } else            g2.setColor(bacNormal);                GradientPaint p = new GradientPaint(0,0,                new Color(0xFFFFFF), 0, 2, bacNormal);        g2.setPaint(p) ;         g2.fillRoundRect(0, 0, getWidth()- 1, getHeight() /2+10, 5, 5);        GradientPaint pInigel = new GradientPaint(0,getHeight()/2-10,bacNormal,0,getHeight(),new Color(0xFFFFFF)) ;         g2.setPaint(pInigel) ;         g2.fillRoundRect(0, getHeight()/2-5, getWidth()- 1, getHeight(), 5, 5);        }        g2.setFont(new Font("方正舒体", 0, 30));        if (getModel().isArmed()) {            g2.setColor(bacNormal);        } else            if(isEntered)                g2.setColor(Color.YELLOW) ;             else            g2.setColor(foreGround);        g2.drawString(text,1, getHeight()/ 2 + 9);        g2.setPaint(oldPaint) ;         super.paintComponent(g);    }

初学java,里面很多都是照着网上写的。单独加入到JFrame是显示正常,可是一加入到JPanel中背景只能显示左上部分,文字显示正常(传不了图啊。。。。)
不知道原因为何,希望知道的友友解释下
附上整个重绘代码:
Java code
package xsb.weiwei;import javax.swing.* ; import java.awt.* ; import java.awt.event.* ; import java.awt.geom.RoundRectangle2D;public class XJButton extends JButton implements MouseListener {    private String text;    private Color bacNormal;    private Color foreGround;    private Color bacClick;    private Shape shape = null;    private int height ;     private boolean isEntered ;    public XJButton(String text) {        this.text = text;        bacNormal = new Color(0xFFB6C1);        foreGround = new Color(0x000000);        bacClick = Color.GRAY;        setContentAreaFilled(false);        addMouseListener(this);        isEntered = false ;         height = 45 ;                     }    public void paintComponent(Graphics g) {        Graphics2D g2 = (Graphics2D)g ;         Paint oldPaint = g2.getPaint() ;         if(isEntered){        if (getModel().isArmed()) {            g2.setColor(bacClick);                    } else            g2.setColor(bacNormal);                GradientPaint p = new GradientPaint(0,0,                new Color(0xFFFFFF), 0, 2, bacNormal);        g2.setPaint(p) ;         g2.fillRoundRect(0, 0, getWidth()- 1, getHeight() /2+10, 5, 5);        GradientPaint pInigel = new GradientPaint(0,getHeight()/2-10,bacNormal,0,getHeight(),new Color(0xFFFFFF)) ;         g2.setPaint(pInigel) ;         g2.fillRoundRect(0, getHeight()/2-5, getWidth()- 1, getHeight(), 5, 5);        }        g2.setFont(new Font("方正舒体", 0, 30));        if (getModel().isArmed()) {            g2.setColor(bacNormal);        } else            if(isEntered)                g2.setColor(Color.YELLOW) ;             else            g2.setColor(foreGround);        g2.drawString(text,1, getHeight()/ 2 + 9);        g2.setPaint(oldPaint) ;         super.paintComponent(g);    }    public void paintBorder(Graphics g) {        if(isEntered){        g.setColor(Color.BLACK);        g.drawRoundRect(0, 0, getWidth()-1,getHeight()-1, 20, 20);        }    }    public boolean contains(int x, int y) {        if (shape == null || shape.getBounds().equals(getBounds())) {            shape = new RoundRectangle2D.Float(0, 0, getWidth(), getHeight(),                    20, 20);        }        return shape.contains(x, y);    }    @Override    public void mouseClicked(MouseEvent arg0) {        // TODO Auto-generated method stub            }    @Override    public void mouseEntered(MouseEvent arg0) {        // TODO Auto-generated method stub        isEntered = true ;         setCursor(new Cursor(Cursor.HAND_CURSOR)) ;         repaint() ;             }    @Override    public void mouseExited(MouseEvent arg0) {        // TODO Auto-generated method stub        isEntered = false ;         repaint() ;     }    @Override    public void mousePressed(MouseEvent arg0) {        // TODO Auto-generated method stub            }    @Override    public void mouseReleased(MouseEvent arg0) {        // TODO Auto-generated method stub            }    public int getWidth(){        return text.length()*35 ;     }    public int getHeight(){        return height ;     }    public String getString(){        return text;     }    public static void main(String[] args){        JFrame jfm = new JFrame("") ;        jfm.setSize(200,200) ;         jfm.setLocation(new Point(400,400)) ;        XJButton x = new XJButton("尝试") ;        x.setOpaque(false) ;        jfm.getContentPane().add(x) ;                 jfm.setVisible(true) ;         jfm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;     }} 



[解决办法]
需要设置JPanel的布局。

修改的main函数
Java code
    public static void main(String[] args) {        JFrame jfm = new JFrame("");        jfm.setSize(200, 200);        jfm.setLocation(new Point(400, 400));        JPanel jp = new JPanel();        jp.setLayout(new GridLayout());        XJButton x = new XJButton("尝试");        x.setOpaque(false);        jp.add(x);                jfm.getContentPane().add(jp);        jfm.setVisible(true);        jfm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    }
[解决办法]
可能是组件被其它组件挤的结果。

选用布局管理器,对界面进行下布局。
详查BorderLayout
[解决办法]
lz用BorderLayout试试,把少掉的那一部分,加到BorderLayout.CENTER上去
或者加大Frame的size
[解决办法]
探讨

不能发图可能大家不太理解我的意思。不过我昨天上网搜了一下,貌似也有人出现这样的问题。也没有人来解答。再等一天,没人就结贴了。

热点排行