【问题标题】:Adding graphic frame into JDialog Form将图形框架添加到 JDialog 表单中
【发布时间】:2014-08-01 00:55:55
【问题描述】:

我正在 java 中创建一个 JDialog 表单。

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

这是图表(一开始使用 double 的原因,之后会用于跟踪美元)

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();

}

}

【问题讨论】:

  • 考虑提供一个runnable example 来证明您的问题。这将导致更少的混乱和更好的响应。这将为我们提供代码结构的线索以及您可能遇到的任何潜在问题...作为旁注,您可以将窗口添加到窗口...
  • 谢谢(代码)...
  • 感谢您的提示和帮助

标签: java swing graphics jdialog


【解决方案1】:

你有两个主要问题...

首先

您正在从JFrame 扩展您的课程。这似乎是一个合理的起点,但它会让您无法将组件用于除框架之外的任何其他东西。

其次

您正在直接绘制到顶级容器,请查看 Why not to draw directly inside JFrame 了解为什么这是个坏主意...

除此之外,您没有调用super.paint,这可能会引入绘画伪影和其他问题的可能性。 paint 是一个非常重要的方法,使用时要非常非常小心。

解决方案

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

查看Performing Custom PaintingPainting in AWT and Swing 了解有关在 Swing 中绘画的更多信息

考虑覆盖 getPreferredSize 以向布局管理器提供大小提示,因此您的组件不会以 0x0 的大小布局...

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

一旦你有了这个JPanel,你可以将它添加到你的JFrameJDialog...

附注

  • 您应该从JFrameJDialog 等基于Windows 的类进行扩展,它不仅使您看起来单次使用,而且还为这些类提供了很少的“扩展”功能。相反,您可以针对 JPanel 等容器开发您的 UI,并根据需要将它们简单地添加到这些基于窗口的类的实例中。
  • 这可能超出了问题的范围,但您可以考虑查看JFreeChart

【讨论】:

  • 感谢您的帮助、时间和详细的评论。你让它很容易理解。感谢您帮助菜鸟
  • 感谢 JFreeChart 的建议。肯定会添加以供将来使用。在这里,我想到了:double px = (300) - (scale) * (arrayDollar[i] - this.min);等式在我的脑海中,并决定完成它。
猜你喜欢
  • 2012-03-23
  • 1970-01-01
  • 2010-10-09
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多