Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JDialog表单中添加图形框架_Java_Swing_Graphics_Jdialog - Fatal编程技术网

Java 在JDialog表单中添加图形框架

Java 在JDialog表单中添加图形框架,java,swing,graphics,jdialog,Java,Swing,Graphics,Jdialog,我正在用java创建一个JDialog表单 我创建了一个类,使用g.drawline将一个数字数组绘制成线形图。我可以单独运行这个类,但我想知道如何将这个类/框架放入jdialog表单中 这是图表(最初使用double的原因是它将用于跟踪美元) 导入java.awt.Graphics; 导入java.awt.Color; 导入javax.swing.JFrame; 公共类AccountGraph扩展了JFrame{ 私人双[]arrayDollar={23000、1400、94506、23450

我正在用java创建一个JDialog表单

我创建了一个类,使用g.drawline将一个数字数组绘制成线形图。我可以单独运行这个类,但我想知道如何将这个类/框架放入jdialog表单中

这是图表(最初使用double的原因是它将用于跟踪美元)

导入java.awt.Graphics;
导入java.awt.Color;
导入javax.swing.JFrame;
公共类AccountGraph扩展了JFrame{
私人双[]arrayDollar={23000、1400、94506、23450、23656、23767、700、24000、8456、23450、23656、2367};
私有双精度[]arrayPx=新双精度[12];
私人双最大值;
私人双敏;
私人双量程;
公共帐户图(){
dollarToPx(this.arrayDollar,this.arrayPx);
设置标题(“图形”);
设置大小(340340);
setVisible(真);
setDefaultCloseOperation(关闭时退出);
}
公共无效dollarToPx(双[]阵列美元,双[]阵列美元){
this.max=arrayDollar[0];//查找数组的最大值
for(int i=1;ithis.max){
this.max=arrayDollar[i];
}
}
this.min=arrayDollar[0];//查找数组的最小值
for(int i=1;ig、 drawLine(40,convAr[0],62,convAr[1]);//本可以用于循环,但x值在-->精确时没有增加。您有两个主要问题

首先 您正在从
JFrame
扩展您的类。这似乎是一个合理的起点,但它会将您锁定在除了一个框架之外,永远无法将该组件用于其他任何东西的状态

其次 你正在直接画一个顶级容器,看看为什么这是一个坏主意

除此之外,您没有调用super.paint
,这可能会导致绘制瑕疵和其他问题。
paint
是一种非常重要的方法,请非常、非常小心地使用它

解决办法 首先,将框架中的代码移动到一个从
JPanel
扩展而来的类。不要覆盖
paint
,而是使用
protectedvoidpaintcomponent(Graphics)
,并确保在执行任何其他自定义绘制之前调用
super.paintComponent

查看和以获取有关Swing中绘画的更多信息

考虑重写
getPreferredSize
以向布局管理器提供大小提示,这样您的组件就不会以
0x0
的大小进行布局

不要假设或使用“神奇”数字,而不是
40,40
。例如,您应该依赖已知状态,例如
getWidth
getHeight
,它们将在绘制组件时告诉您组件的当前大小。这不是绝对必需的,您可以“修复”渲染的大小,但这样做会使组件更加灵活;)

一旦你有了这个
JPanel
,你可以将它添加到你的
JFrame
或者
JDialog

旁注
  • 您应该从基于windows的类(如
    JFrame
    JDialog
    )进行扩展,它不仅让您可以单独使用,而且还提供了一些“扩展”相反,根据容器(如
    JPanel
    )开发UI,并根据需要将它们添加到这些基于窗口的类的实例中
  • 这可能超出了问题的范围,但你可以考虑看看。
考虑提供一个演示您的问题的示例。这将减少混乱并获得更好的响应。这将为我们提供线索,如代码结构和您可能遇到的任何潜在问题……作为旁注,您可以将窗口添加到窗口中……谢谢(代码)…谢谢你的提示和帮助我感谢你的帮助、时间和你的详细评论。你让它很容易理解。谢谢你帮助了noobThanks的JFreeChart建议。肯定会添加以供将来使用。在这里,我考虑了:double px=(300)-(scale)*(arrayDollar[I]-this.min)我脑子里想的是一个方程式,刚决定完成它。
import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JFrame;

public class AccountGraph extends JFrame {

private double[] arrayDollar = {23000, 1400, 94506, 23450, 23656, 23767, 700, 24000, 8456, 23450, 23656, 2367};
private double[] arrayPx = new double[12];
private double max;
private double min;
private double range;

public AccountGraph() {
    dollarToPx(this.arrayDollar, this.arrayPx);
    setTitle("Graph");
    setSize(340, 340);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public void dollarToPx(double[] arrayDollar, double[] arrayPx) {

    this.max = arrayDollar[0];          //find max of array

    for (int i = 1; i < arrayDollar.length; i++) {
        if (arrayDollar[i] > this.max) {
            this.max = arrayDollar[i];
        }

    }

    this.min = arrayDollar[0];        //find min of array
    for (int i = 1; i < arrayDollar.length; i++) {
        if (arrayDollar[i] < this.min) {
            this.min = arrayDollar[i];
        }

    }

    this.range = this.max - this.min;   //range of data (max-min)

    double scale = 260/this.range;   //scale range to graph px - 260 px = amount of px for graph

    for (int i = 0; i < arrayDollar.length; i++) {
        double px = (300) - (scale) * (arrayDollar[i] - this.min); //equation for y px on graph 
        System.out.println(px);
        arrayPx[i] = px;

    }

}

public void paint(Graphics g) {

    g.setColor(Color.BLACK);

    g.drawLine(40, 40, 40, 300);
    g.drawLine(40, 300, 277, 300);

    g.setColor(Color.LIGHT_GRAY);
    g.drawLine(62, 40, 62, 300);
    g.drawLine(83, 40, 83, 300);
    g.drawLine(105, 40, 105, 300);
    g.drawLine(126, 40, 126, 300);
    g.drawLine(148, 40, 148, 300);
    g.drawLine(170, 40, 170, 300);
    g.drawLine(191, 40, 191, 300);
    g.drawLine(213, 40, 213, 300);
    g.drawLine(234, 40, 234, 300);
    g.drawLine(255, 40, 255, 300);
    g.drawLine(277, 40, 277, 300);

    int convAr[] = new int[12];  // double cannot be input into g.drawLine method

    for (int i = 0; i < convAr.length; i++) {
        convAr[i] = (int) arrayPx[i];

    }

    g.setColor(Color.green);

    g.drawLine(40, convAr[0], 62, convAr[1]); //would have done for loop, but x values did not increase at -->exact<-- linear rate
    g.drawLine(62, convAr[1], 83, convAr[2]);
    g.drawLine(83, convAr[2], 105, convAr[3]);
    g.drawLine(105, convAr[3], 126, convAr[4]);
    g.drawLine(126, convAr[4], 148, convAr[5]);
    g.drawLine(148, convAr[5], 170, convAr[6]);
    g.drawLine(170, convAr[6], 191, convAr[7]);
    g.drawLine(191, convAr[7], 213, convAr[8]);
    g.drawLine(213, convAr[8], 234, convAr[9]);
    g.drawLine(234, convAr[9], 255, convAr[10]);
    g.drawLine(255, convAr[10], 277, convAr[11]);

}

public static void main(String[] args) {
    AccountGraph ag = new AccountGraph();

}

}