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

小文件 2012-08-09 06:35:57
重绘JButton的代码paintComponent如下:
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中背景只能显示左上部分,文字显示正常(传不了图啊。。。。)
不知道原因为何,希望知道的友友解释下
附上整个重绘代码:
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) ;
}

}
...全文
287 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
小文件 2012-08-11
  • 打赏
  • 举报
回复
呵呵,谢谢[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:

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

可以发图的 lz可以将图片上传到相册里,再为相册里的图片单独打开一个网页,
插入图片就插入对应的url就行了
[/Quote]
Sad4This 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

不能发图可能大家不太理解我的意思。不过我昨天上网搜了一下,貌似也有人出现这样的问题。也没有人来解答。再等一天,没人就结贴了。
[/Quote]
可以发图的 lz可以将图片上传到相册里,再为相册里的图片单独打开一个网页,
插入图片就插入对应的url就行了
小文件 2012-08-10
  • 打赏
  • 举报
回复
不能发图可能大家不太理解我的意思。不过我昨天上网搜了一下,貌似也有人出现这样的问题。也没有人来解答。再等一天,没人就结贴了。
小文件 2012-08-09
  • 打赏
  • 举报
回复
应该不是布局的问题,因为只是背景少了,绘出来的文字还是完整的
[Quote=引用 5 楼 的回复:]

lz用BorderLayout试试,把少掉的那一部分,加到BorderLayout.CENTER上去
或者加大Frame的size
[/Quote]
Sad4This 2012-08-09
  • 打赏
  • 举报
回复
lz用BorderLayout试试,把少掉的那一部分,加到BorderLayout.CENTER上去
或者加大Frame的size
小文件 2012-08-09
  • 打赏
  • 举报
回复
嗯。。。加分了,我把测试的主类也贴上来吧
[code = java]package xsb.weiwei;
import javax.swing.* ;
import java.awt.* ;
import java.awt.event.* ;
public class ZZTT {
private JFrame jfm ;
public ZZTT(){
jfm = new JFrame("自助投胎机") ;
init() ;
jfm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;

jfm.setSize(400,300) ;
jfm.setVisible(true) ;
}
void init(){
JLabel jbl = new JLabel("欢迎使用");
jbl.setFont(new Font("方正舒体",0,30)) ;
jbl.setForeground(Color.CYAN) ;
jbl.setOpaque(false) ;
JPanel xp = new JPanel() ;

xp.setLayout(new BoxLayout(xp,BoxLayout.Y_AXIS)) ;
xp.add(jbl) ;
xp.add(new XJButton("哈哈")) ;
jfm.getContentPane().add(xp,BorderLayout.CENTER) ;
}
public static void main(String[] args){
new ZZTT() ;

}


}
[/code]
在另一个文件中,麻烦友友测试一下,新手请各位不吝赐教,thanks
小文件 2012-08-09
  • 打赏
  • 举报
回复
嗯,JPanel设置的是BoxLayout,(开始是默认的FlowLayout),加入到JFrame中没有问题,但是加入到JPanel中显示不出来了


[Quote=引用 2 楼 的回复:]

可能是组件被其它组件挤的结果。

选用布局管理器,对界面进行下布局。
详查BorderLayout
[/Quote]
brightyq 2012-08-09
  • 打赏
  • 举报
回复
可能是组件被其它组件挤的结果。

选用布局管理器,对界面进行下布局。
详查BorderLayout
FFF9527 2012-08-09
  • 打赏
  • 举报
回复
需要设置JPanel的布局。

修改的main函数

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

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧