Java JFrame中的自定义绘图不';t显示

Java JFrame中的自定义绘图不';t显示,java,swing,graphics,Java,Swing,Graphics,我正在设计一个条形图,但它没有显示。正在显示其封装的JFrame,并且正在调用paintComponent(),但没有出现灰色网格线。为什么会这样 class ChartArea extends JPanel { private int Yscl, Xscl; private static final Color BACKGROUND_COLOR = Color.BLACK; private static final Color LINE_COL

我正在设计一个条形图,但它没有显示。正在显示其封装的JFrame,并且正在调用
paintComponent()
,但没有出现灰色网格线。为什么会这样

class ChartArea extends JPanel {

        private int Yscl, Xscl;
        private static final Color BACKGROUND_COLOR = Color.BLACK;
        private static final Color LINE_COLOR = Color.GREEN;
        private static final Color GRIDLINE_COLOR = Color.GRAY;

        ChartArea() {
            setBackground(BACKGROUND_COLOR);
            setForeground(LINE_COLOR);
            Yscl = 20;
            Xscl = 20;
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            int height = getHeight();
            int width = getWidth();
            double max = data.getMax(); //gets the maximum value in the data set

            try {
                g2d.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));

                //put the origin in the bottom right. Positive is up and left
                g2d.translate(width, height);
                g2d.scale(-1d, -1d);

                //if the data set exceeds the window height, scale it down
                if (max > height) {
                    g2d.scale(1, height / max);
                }
                paintGrid(g2d);
                paintLine(g2d);
            } finally {
                g2d.dispose();
            }
        }

        private void paintGrid(Graphics2D g) {
            g.setPaint(GRIDLINE_COLOR);

            //Vertical Lines
            for (double pos = 0; pos > getWidth(); pos += Xscl) {
                Line2D line = new Line2D.Double(pos, 0d, pos, getHeight());
                g.draw(line);
            }

            //Horizontal Lines
            for (double pos = 0; pos > getHeight(); pos += Yscl) {
                Line2D line = new Line2D.Double(0d, pos, getWidth(), pos);
                g.draw(line);
            }
        }

        private void paintLine(Graphics2D g) {
            g.setPaint(LINE_COLOR);
            Path2D plot2 = new Path2D.Double();

            if (!data.isEmpty()) {
                plot2.moveTo(0.0, data.get(0));
                for (int i = 1; i < data.size(); i++) {
                    plot2.lineTo((double) i, data.get(i));
                }
                g.draw(plot2);
            }
        }
class ChartArea扩展了JPanel{
私人国际Yscl、Xscl;
私有静态最终颜色背景颜色=Color.BLACK;
专用静态最终颜色线\u Color=Color.GREEN;
专用静态最终颜色网格线\u Color=Color.GRAY;
图表区(){
立根背景(背景色);
设置前景(线条颜色);
Yscl=20;
Xscl=20;
}
@凌驾
公共组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
int height=getHeight();
int width=getWidth();
double max=data.getMax();//获取数据集中的最大值
试一试{
g2d.设定行程(新的基本行程(1f,基本行程.端头,基本行程.连接端));
//把原点放在右下角,正数在左上角
g2d.平移(宽度、高度);
g2d.刻度(-1d,-1d);
//如果数据集超过窗口高度,请将其缩小
如果(最大>高度){
g2d.刻度(1,高度/最大值);
}
油漆网格(g2d);
油漆线(g2d);
}最后{
g2d.dispose();
}
}
专用void paintGrid(图形2d g){
g、 setPaint(网格线颜色);
//垂直线
对于(双pos=0;pos>getWidth();pos+=Xscl){
Line2D line=新的Line2D.Double(pos,0d,pos,getHeight());
g、 画(线);
}
//水平线
对于(双位置=0;位置>getHeight();位置+=Yscl){
Line2D line=新的Line2D.Double(0d,pos,getWidth(),pos);
g、 画(线);
}
}
专用虚空漆线(图形2D g){
g、 setPaint(线条颜色);
Path2D plot2=新的Path2D.Double();
如果(!data.isEmpty()){
plot2.moveTo(0.0,data.get(0));
对于(int i=1;i
您正在覆盖paintComponent以仅绘制自定义面板。您只需绘制父实例即可

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    // custom painting
}

中似乎有一个输入错误,用于绘制线条的
循环条件。循环从未在当前条件下执行。如果将条件更改为
pos
pos
,您应该会看到网格。下面是一个完整的方法:

private void paintGrid(Graphics2D g) {
    g.setPaint(GRIDLINE_COLOR);

    //Vertical Lines
    //for (double pos = 0; pos > getWidth(); pos += Xscl) {
    for (double pos = 0; pos < getWidth(); pos += Xscl) {
        Line2D line = new Line2D.Double(pos, 0d, pos, getHeight());
        g.draw(line);
    }

    //Horizontal Lines
    //for (double pos = 0; pos > getHeight(); pos += Yscl) {
    for (double pos = 0; pos < getHeight(); pos += Yscl) {
        Line2D line = new Line2D.Double(0d, pos, getWidth(), pos);
        g.draw(line);
    }
}
private void paintGrid(图形2d g){
g、 setPaint(网格线颜色);
//垂直线
//对于(双pos=0;pos>getWidth();pos+=Xscl){
对于(双位置=0;位置getHeight();位置+=Yscl){
对于(双位置=0;位置
结果如下:


试着简化。你的比例缩小了吗?你按w+h平移,然后缩放到负数,然后再弄乱比例。试着在缩放/平移之前画些东西,看看你的数学假设是否不正确。缩放到负数只是翻转轴,这样当它位于右下角时,我就不必让所有坐标都为负数ive.我99.999%相信这不是问题所在。好吧,这给你留下了0.001的机会你错了:)你试过了吗?(技术上这里没有任何AWT,是吗?这都是swing)@John(几乎唯一涉及的swing是JPanel,其余都是AWT)我弄乱了比例,它没有改变任何东西。不过谢谢你的建议。好的,现在我得到了一个黑色背景,但没有网格线。请确保在调用
super.paintComponent
后进行网格线绘制。如果网格线继续不绘制,则网格绘制代码中可能有问题。如果您正在绘制整个区域,你可能不想调用super,你可能想自己用你想要的图形颜色填充背景。我试图用
图形绘制一个矩形。drawRect(int,int,int,int),int)
,它只在我的JPanel顶部绘制了一条±2px厚的黑色水平线。添加
super.paintComponent(g)后
成功了。@JohnGardner