我创建了扩展JComponent的Card类。我没有使用任何类型的布局。但是当我使用setBounds()方法将我的卡添加到特定位置的JFrame时,图像会切断,如下所示:
涂料卡方法:
@Override
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
if(degrees!=0) g2d.rotate(Math.toRadians(degrees));
int first,second;
switch(colorCardType){
case RED_HEART: first = 0;
break;
case RED_DIAMOND: first = 1;
break;
case BLACK_SPADE: first = 2;
break;
case BLACK_CLUB: first = 3;
break;
default: first = 4;
break;
}
switch(cardType) {
case ACE: second = 0;
break;
case TWO: second = 1;
break;
case THREE: second = 2;
break;
case FOUR: second = 3;
break;
case FIVE: second = 4 ;
break;
case SIX: second = 5;
break;
case SEVEN: second = 6 ;
break;
case EIGHT: second = 7;
break;
case NINE: second =8 ;
break;
case TEN: second = 9;
break;
case JACK: second = 10;
break;
case QUEEN: second = 11;
break;
case KING: second = 12;
break;
default: second = 0;
break;
}
g2d.drawImage(images[first][second], super.getX(), super.getY(), null);
}
主要代码:( importmant部分)
frame = new JFrame();
frame.setLayout(null);
Card test = new Card(CardType.ACE,ColorCardType.RED_HEART,0);
frame.add(test);
test.setBounds(40,0,72,96);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
答案 0 :(得分:3)
在绘制方法中,坐标是相对于组件本身的。将super.getX(), super.getY()
替换为相对于组件本身的坐标;例如,左上角是0, 0
。
由于您希望能够旋转图像,因此您需要使组件与图像的对角线长度一样大,√(72 2 + 96 < sup> 2 ),或120 x 120像素。
最后,您想要相对于组件的中心绘制卡片。在g2d.rotate
之前,添加此项以将绘图原点更改为组件的中心:
g2d.translate(getWidth() / 2.0, getHeight() / 2.0);
然后更改drawImage调用以相对于组件的中心绘制:
g2d.drawImage(images[first][second], -(72 / 2), -(96 / 2), null);
理想情况下,72和96当然不应该是硬编码的,应该从图像本身的大小中获得(如果图像是BufferedImage,这很容易,但不是那么容易)。