为什么我的图像没有完全绘制?

时间:2014-12-13 18:53:18

标签: java swing graphics

我创建了扩展JComponent的Card类。我没有使用任何类型的布局。但是当我使用setBounds()方法将我的卡添加到特定位置的JFrame时,图像会切断,如下所示: enter image description here

涂料卡方法:

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

1 个答案:

答案 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,这很容易,但不是那么容易)。