我在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();
}
}
答案 0 :(得分:1)
你有两个主要问题......
您正在从JFrame
扩展您的班级。这似乎是一个合理的起点,但它会锁定你从来没有能够将该组件用于框架以外的任何其他东西。
您正在直接绘制到顶级容器,请查看Why not to draw directly inside JFrame,了解为什么这是个坏主意......
除此之外,你没有调用super.paint
,这可能会引入绘画工件和其他问题的可能性。 paint
是一个非常重要的方法,非常非常小心它的使用。
首先将框架中的代码移动到类似JPanel
的类。请改为使用paint
而不是覆盖protected void paintComponent(Graphics)
,并确保在进行任何其他自定义绘画之前调用super.paintComponent
。
有关在Swing中绘画的更多信息,请查看Performing Custom Painting和Painting in AWT and Swing
考虑覆盖getPreferredSize
以向布局管理器提供大小调整提示,因此您的组件的布局大小不是0x0
...
不要假设或使用“魔术”数字,而不是40, 40
,例如,您应该依赖已知状态,例如getWidth
和getHeight
,这会告诉您绘制时组件的当前大小。这不是绝对必需的,您可以“修复”渲染的大小,但如果您这样做,它将使您的组件更加灵活;)
获得此JPanel
后,您可以将其添加到JFrame
或JDialog
...
JFrame
和JDialog
,不仅可以将您看作一次使用,而且还为类提供了很少的“扩展”功能。相反,针对像JPanel
这样的容器开发UI,只需根据需要将它们添加到这些基于窗口的类的实例中。