2013-03-26 57 views
0

这是我的代码:如何在不偏离中心的情况下使圆形比圆弧更大?

import java.awt.Graphics; 
import java.awt.GridLayout; 
import javax.swing.JPanel; 
import javax.swing.JFrame; 

public class fourfans extends JFrame { 
public fourfans(){ 
    setTitle("DrawArcs"); 
    add(new ArcsPanel()); 
    add(new ArcsPanel()); 
    add(new ArcsPanel()); 
    add(new ArcsPanel()); 

} 

public static void main(String[] args) { 
    fourfans frame = new fourfans(); 
    GridLayout test = new GridLayout(2,2); 
    frame.setLayout(test); 
    frame.setSize(250 , 300); 
    frame.setLocationRelativeTo(null); // center the frame 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 


} 


} 


class ArcsPanel extends JPanel{ 

protected void paintComponent(Graphics g){ 
    super.paintComponent(g); 

    int xCenter = getWidth()/2; 
    int yCenter = getHeight()/2; 
    int radius = (int)(Math.min(getWidth(), getHeight()) * 0.4); 

    int x = xCenter - radius; 
    int y = yCenter - radius; 

    g.fillArc(x, y, 2 * radius, 2 * radius, 0, 30); 
    g.fillArc(x, y, 2 * radius, 2 * radius, 90, 30); 
    g.fillArc(x, y, 2 * radius, 2 * radius, 180, 30); 
    g.fillArc(x, y, 2 * radius, 2 * radius, 270, 30); 
    g.drawOval(x, y, 2 * radius, 2 * radius);  
} 
} 

每次我尝试了2个*半径改为2.1 *半径,它不会让我,因为这是一个双。然后当我输入一个大于弧线的固定数字时,它会使得该弧线偏离中心。

+1

'2.1f * radius'? '(int)(2.1 * radius)'? – Patashu 2013-03-26 21:37:56

+0

@Patashu似乎已经解决了双重问题,但这并不能解决我的圈子偏离中心问题。 – BluceRee 2013-03-26 21:49:26

回答

0

为什么把一个大于圆弧的数字放在你的圆心的中心是因为Java把你的左上角作为x,y而不是圆/圆弧的原点。所以如果你让其中一个更大,你必须重新计算它的x和y,例如

int radius = (int)(Math.min(getWidth(), getHeight()) * 0.4); 
int radiusOval = (int)(Math.min(getWidth(), getHeight()) * 0.4 * 1.05); 

int x = xCenter - radius; 
int y = yCenter - radius; 
int xOval = xCenter - radiusOval; 
int yOval = yCenter - radiusOval; 

g.fillArc(x, y, 2 * radius, 2 * radius, 0, 30); 
g.fillArc(x, y, 2 * radius, 2 * radius, 90, 30); 
g.fillArc(x, y, 2 * radius, 2 * radius, 180, 30); 
g.fillArc(x, y, 2 * radius, 2 * radius, 270, 30); 
g.drawOval(xOval, yOval, (int)(2.1 * radius), (int)(2.1 * radius));