2013-03-04 97 views
0

我想讓Swing中的柱狀圖,我發現在(中的Java Swing演示條形圖)一些代碼 - http://www.java2s.com/Code/Java/2D-Graphics-GUI/Demobarchartandpiechart.htm需要幫助修改Java代碼我的要求

它產生三種類型的圖表。但是,我只想要沒有陰影的條形圖。我知道很少擺動,所以我無法弄清楚整個代碼。

請幫我刪除這樣的部分,只有我只得到沒有陰影的條形圖。

UPDATE

最後,我編輯的代碼。請告訴我是否有任何不必要的代碼 -

這是編輯的代碼。請告訴我它是否有不必要的代碼。我刪除了一些變量,並編輯了導入語句以使該死的事情變得緊湊。

import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 
import javax.swing.*; 


public class Charts2D extends JFrame { 

public Charts2D() { 
super("2D Charts"); 
setSize(280, 280); 
getContentPane().setLayout(new GridLayout(1, 1, 10, 0)); 
getContentPane().setBackground(Color.white); 

int[] xData = new int[8]; 
int[] yData = new int[8]; 
for (int i = 0; i < xData.length; i++) { 
    xData[i] = i; 
    yData[i] = (int) (Math.random() * 100); 
    if (i > 0) 
    yData[i] = (yData[i - 1] + yData[i])/2; 
} 

JChart2D chart = new JChart2D(xData.length, xData, yData,"Column Chart"); 
GradientPaint gp = new GradientPaint(0, 100, Color.white, 0, 300, Color.blue, true); 
chart.setGradient(gp); 
chart.setEffectIndex(JChart2D.Gradientffect); 
getContentPane().add(chart); 

WindowListener wndCloser = new WindowAdapter() { 
    public void windowClosing(WindowEvent e) { 
    System.exit(0); 
    } 
}; 
addWindowListener(wndCloser); 

setVisible(true); 
} 

public static void main(String argv[]) { 
new Charts2D(); 
} 

} 

class JChart2D extends JPanel { 

public static final int PLainEffect = 0; 

public static final int Gradientffect = 1; 

public static final int ImageEffect = 2; 

protected JLabel titleLabel; 

protected ChartPanel chartPanel; 

protected int dataLength; 

protected int[] xData; 

protected int[] yData; 

protected int xMin; 

protected int xMax; 

protected int yMin; 

protected int yMax; 

protected double[] pieData; 

protected int m_effectIndex = PLainEffect; 

protected Stroke stroke; 

protected GradientPaint gradient; 

protected Image foregroundImage; 

protected Color lineColor = Color.black; 

protected Color columnColor = Color.blue; 

protected int columnWidth = 12; 

public JChart2D(int nData, int[] yData, String text) { 
this(nData, null, yData, text); 
} 

public JChart2D(int nData, int[] xD, int[] yD, String text) { 
super(new BorderLayout()); 
setBackground(Color.white); 
titleLabel = new JLabel(text, JLabel.CENTER); 
add(titleLabel, BorderLayout.NORTH); 

if (xData == null) { 
    xData = new int[nData]; 
    for (int k = 0; k < nData; k++) 
    xData[k] = k; 
} 
if (yD == null) 
    throw new IllegalArgumentException("yData can't be null"); 
if (nData > yD.length) 
    throw new IllegalArgumentException("Insufficient yData length"); 
if (nData > xD.length) 
    throw new IllegalArgumentException("Insufficient xData length"); 
dataLength = nData; 
xData = xD; 
yData = yD; 

xMin = xMax = 0; // To include 0 into the interval 
yMin = yMax = 0; 
for (int k = 0; k < dataLength; k++) { 
    xMin = Math.min(xMin, xData[k]); 
    xMax = Math.max(xMax, xData[k]); 
    yMin = Math.min(yMin, yData[k]); 
    yMax = Math.max(yMax, yData[k]); 
} 
if (xMin == xMax) 
    xMax++; 
if (yMin == yMax) 
    yMax++; 

chartPanel = new ChartPanel(); 
add(chartPanel, BorderLayout.CENTER); 
} 

public void setEffectIndex(int effectIndex) { 
m_effectIndex = effectIndex; 
repaint(); 
} 

public int getEffectIndex() { 
return m_effectIndex; 
} 

public void setStroke(Stroke s) { 
stroke = s; 
chartPanel.repaint(); 
} 

public void setForegroundImage(Image img) { 
foregroundImage = img; 
repaint(); 
} 

public Image getForegroundImage() { 
return foregroundImage; 
} 

public Stroke getStroke() { 
return stroke; 
} 

public void setGradient(GradientPaint g) { 
gradient = g; 
repaint(); 
} 

public GradientPaint getGradient() { 
return gradient; 
} 

public void setColumnWidth(int c) { 
columnWidth = c; 
chartPanel.calcDimensions(); 
chartPanel.repaint(); 
} 

public int setColumnWidth() { 
return columnWidth; 
} 

public void setColumnColor(Color c) { 
columnColor = c; 
chartPanel.repaint(); 
} 

public Color getColumnColor() { 
return columnColor; 
} 

public void setLineColor(Color c) { 
lineColor = c; 
chartPanel.repaint(); 
} 

public Color getLineColor() { 
return lineColor; 
} 


class ChartPanel extends JComponent { 
int xMargin = 5; 

int yMargin = 5; 

int pieGap = 10; 

int m_x; 

int m_y; 

int m_w; 

int m_h; 

ChartPanel() { 
    enableEvents(ComponentEvent.COMPONENT_RESIZED); 
} 

protected void processComponentEvent(ComponentEvent e) { 
    calcDimensions(); 
} 

public void calcDimensions() { 
    Dimension d = getSize(); 
    m_x = xMargin; 
    m_y = yMargin; 
    m_w = d.width - 2 * xMargin; 
    m_h = d.height - 2 * yMargin; 
    m_x += columnWidth/2; 
    m_w -= columnWidth; 

} 

public int xChartToScreen(int x) { 
    return m_x + (x - xMin) * m_w/(xMax - xMin); 
} 

public int yChartToScreen(int y) { 
    return m_y + (yMax - y) * m_h/(yMax - yMin); 
} 

public void paintComponent(Graphics g) { 
    int x0 = 0; 
    int y0 = 0; 

    g.setColor(Color.black); 
    x0 = xChartToScreen(0); 
    g.drawLine(x0, m_y, x0, m_y + m_h); 
    y0 = yChartToScreen(0); 
    g.drawLine(m_x, y0, m_x + m_w, y0); 

    Graphics2D g2 = (Graphics2D) g; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
     RenderingHints.VALUE_ANTIALIAS_ON); 
    g2.setRenderingHint(RenderingHints.KEY_RENDERING, 
     RenderingHints.VALUE_RENDER_QUALITY); 

    if (stroke != null) 
    g2.setStroke(stroke); 

    GeneralPath path = new GeneralPath(); 

    for (int k = 0; k < dataLength; k++) { 
     xMax++; 
     int x = xChartToScreen(xData[k]); 
     int w = columnWidth; 
     int y1 = yChartToScreen(yData[k]); 
     int y = Math.min(y0, y1); 
     int h = Math.abs(y1 - y0); 
     Shape rc = new Rectangle2D.Double(x, y, w, h); 
     path.append(rc, false); 
     xMax--; 
    } 

    if (m_effectIndex == Gradientffect && gradient != null) { 
     g2.setPaint(gradient); 
     g2.fill(path); 
    } else if (m_effectIndex == ImageEffect 
     && foregroundImage != null) 
     fillByImage(g2, path, 0); 
    else { 
     g2.setColor(columnColor); 
     g2.fill(path); 
    } 
    g2.setColor(lineColor); 
    g2.draw(path); 

} 


protected void fillByImage(Graphics2D g2, Shape shape, int xOffset) { 
    if (foregroundImage == null) 
    return; 
    int wImg = foregroundImage.getWidth(this); 
    int hImg = foregroundImage.getHeight(this); 
    if (wImg <= 0 || hImg <= 0) 
    return; 
    g2.setClip(shape); 
    Rectangle bounds = shape.getBounds(); 
    for (int i = bounds.x + xOffset; i < bounds.x + bounds.width; i += wImg) 
    for (int j = bounds.y; j < bounds.y + bounds.height; j += hImg) 
     g2.drawImage(foregroundImage, i, j, this); 
} 
} 
} 
+0

disable'chart.setDrawShadow(true);'??? – mKorbel 2013-03-04 07:39:25

+0

@mKorbel - 我做到了。禁用陰影並刪除其他2個圖表。 – SuperStar 2013-03-04 07:56:35

回答

1

開始從交換機除去這2例,顯然刪除開關,因爲你要只有一個圖表

case LineChart: 
    g2.setColor(lineColor); 
    path.moveTo(xChartToScreen(xData[0]), 
     yChartToScreen(yData[0])); 
    for (int k = 1; k < dataLength; k++) 
     path.lineTo(xChartToScreen(xData[k]), 
      yChartToScreen(yData[k])); 
    g2.draw(path); 
    break; 

    case ColumnChart: 
    for (int k = 0; k < dataLength; k++) { 
     xMax++; 
     int x = xChartToScreen(xData[k]); 
     int w = columnWidth; 
     int y1 = yChartToScreen(yData[k]); 
     int y = Math.min(y0, y1); 
     int h = Math.abs(y1 - y0); 
     Shape rc = new Rectangle2D.Double(x, y, w, h); 
     path.append(rc, false); 
     xMax--; 
    } 

    if (drawShadow) { 
     AffineTransform s0 = new AffineTransform(1.0, 0.0, 0.0, 
      -1.0, x0, y0); 
     s0.concatenate(AffineTransform.getScaleInstance(1.0, 0.5)); 
     s0.concatenate(AffineTransform.getShearInstance(0.5, 0.0)); 
     s0.concatenate(new AffineTransform(1.0, 0.0, 0.0, -1.0, 
      -x0, y0)); 
     g2.setColor(Color.gray); 
     Shape shadow = s0.createTransformedShape(path); 
     g2.fill(shadow); 
    } 

    if (m_effectIndex == Gradientffect && gradient != null) { 
     g2.setPaint(gradient); 
     g2.fill(path); 
    } else if (m_effectIndex == ImageEffect 
     && foregroundImage != null) 
     fillByImage(g2, path, 0); 
    else { 
     g2.setColor(columnColor); 
     g2.fill(path); 
    } 
    g2.setColor(lineColor); 
    g2.draw(path); 
    break; 

在此之後,你可以刪除所有未使用的方法/變量(按照如果你使用eclipse的警告)

我想你也可以修改這段代碼:

if (m_chartType == PieChart) { 
    double sum = 0; 
    for (int k = 0; k < dataLength; k++) { 
    yData[k] = Math.max(yData[k], 0); 
    sum += yData[k]; 
    } 
    pieData = new double[dataLength]; 
    for (int k = 0; k < dataLength; k++) 
    pieData[k] = yData[k] * 360.0/sum; 
} 

chartPanel = new ChartPanel(); 
add(chartPanel, BorderLayout.CENTER); 

納入:

if (m_chartType == PieChart) { 
    double sum = 0; 
    for (int k = 0; k < dataLength; k++) { 
    yData[k] = Math.max(yData[k], 0); 
    sum += yData[k]; 
    } 
    pieData = new double[dataLength]; 
    for (int k = 0; k < dataLength; k++) 
    pieData[k] = yData[k] * 360.0/sum; 
    chartPanel = new ChartPanel(); 
    add(chartPanel, BorderLayout.CENTER); 
} 
+0

刪除案件。沒有圖表顯示。但是,這些圖表和這些圖表的標題有空的空間。現在處理陰影。 – SuperStar 2013-03-04 07:38:26

+0

爲你應該檢查的另一部分代碼編輯我的答案。看看公共的'JChart2D(int type,int nData,int [] xD,int [] yD,String text)',在編輯的答案中給出一個提示。 – araknoid 2013-03-04 07:43:21

+0

是的,現在我只得到一個沒有陰影的柱狀圖。但是兩個圖表之間的差距太大,x軸和y軸上也沒有標記。我想把標記和縮小差距。 – SuperStar 2013-03-04 07:50:39