1

問題は、棒グラフの下のテキストが棒グラフの棒と揃っていないことです。それらを適切に整列させるにはどうすればよいですか?

あなたの検出器を黙らせるために、この質問の詳細としてさらに何を追加できますか? :)

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

public class SimpleBarChart extends JPanel {

    private double[] value;
    private String[] languages;
    private String title;
    private int gapBetweenBars = 40;//MODIFICATION - NOT A PART OF ORIGINAL CODE

    public SimpleBarChart(double[] val, String[] lang, String t) {
        languages = lang;
        value = val;
        title = t;
    }

    public void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        if (value == null || value.length == 0) {
            return;
        }
        double minValue = 0;
        double maxValue = 0;
        for (int i = 0; i < value.length; i++) {
            if (minValue > value[i]) {
                minValue = value[i];
            }
            if (maxValue < value[i]) {
                maxValue = value[i];
            }
        }
        Dimension dim = getSize();
        int clientWidth = dim.width;
        int clientHeight = dim.height;
        int barWidth = clientWidth / value.length;

        barWidth = barWidth / 3;//MODIFICATION - NOT A PART OF ORIGINAL CODE

        Font titleFont = new Font("Book Antiqua", Font.BOLD, 15);
        FontMetrics titleFontMetrics = graphics.getFontMetrics(titleFont);
        Font labelFont = new Font("Book Antiqua", Font.PLAIN, 10);
        FontMetrics labelFontMetrics = graphics.getFontMetrics(labelFont);
        int titleWidth = titleFontMetrics.stringWidth(title);
        int q = titleFontMetrics.getAscent();
        int p = (clientWidth - titleWidth) / 2;
        graphics.setFont(titleFont);
        graphics.drawString(title, p, q);
        int top = titleFontMetrics.getHeight();
        int bottom = labelFontMetrics.getHeight();

        if (maxValue == minValue) {
            return;
        }

        double scale = (clientHeight - top - bottom) / (maxValue - minValue);
        q = clientHeight - labelFontMetrics.getDescent();
        graphics.setFont(labelFont);

        for (int j = 0; j < value.length; j++) {
            int valueP = j * (barWidth + gapBetweenBars) + 1; //MODIFICATION - NOT A PART OF    ORIGINAL CODE
            int valueQ = top;
            int height = (int) (value[j] * scale);
            if (value[j] >= 0) {
                valueQ += (int) ((maxValue - value[j]) * scale);
            } else {
                valueQ += (int) (maxValue * scale);
                height = -height;
            }
            graphics.setColor(Color.blue);
            graphics.fillRect(valueP, valueQ, barWidth - 2, height);
            graphics.setColor(Color.black);
            graphics.drawRect(valueP, valueQ, barWidth - 2, height);
            int labelWidth = labelFontMetrics.stringWidth(languages[j]);
            p = j * barWidth + (barWidth - labelWidth) / 2;
            graphics.drawString(languages[j], p, q);
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setSize(500, 500);
        double[] value = new double[5];
        String[] languages = new String[5];
        value[0] = 1;
        languages[0] = "Visual Basic";

        value[1] = 2;
        languages[1] = "PHP";

        value[2] = 3;
        languages[2] = "C++";

        value[3] = 4;
        languages[3] = "C";

        value[4] = 5;
        languages[4] = "Java";

        frame.getContentPane().add(new SimpleBarChart(value, languages, "Programming    Languages"));

        WindowListener winListener = new WindowAdapter() {
            public void windowClosing(WindowEvent event) {
                System.exit(0);
            }
        };
        frame.addWindowListener(winListener);
        frame.setVisible(true);
    }

    public void setGapBetweenBars(int gapBetweenBars) {

        this.gapBetweenBars = gapBetweenBars;
    }

    public int getGapBetweenBars() {

        return this.gapBetweenBars;
    }
}
4

2 に答える 2

3

これを for ループの側で使用します

int labelWidth = labelFontMetrics.stringWidth(languages[j]);
p = j * (barWidth+gapBetweenBars) + (barWidth - labelWidth) / 2;

言語文字列間のスペースの計算を変更

于 2013-03-04T10:41:55.937 に答える
3

for ループの の値pが正しくないため、次のようにする必要があります。

p = j * (barWidth + gapBetweenBars) + (barWidth - labelWidth) / 2;

ギャップを考慮するのを忘れていました。

于 2013-03-04T10:43:19.397 に答える