DragChartPanel可拖拽曲线应用详解

DragChartPanel  是java cs架构中的一种图形展现的开源组件。

业务需求需要用到DragChartPanel  ,这是一种根据jtable表格中的数据给与展示的图形组件。它和其他图形组件区别再与它可以进行拖拽,用户通过它不仅可以看出数据变化的曲线,而且可以通过拖拽修改表格中的数据。

下面展示一下它的效果图:

丑归丑,但是很实用呀。

下面展示它的代码

初始化坐标格图:

chartpanel1 = new DragChartPanel(this);
chartpanel1.setXtitle("时 间");
chartpanel1.setYtitle("负 荷(MW)");
chartpanel1.setDragLabel(jLabel1);
chartpanel1.setTm((DefaultTableModel) jTable1.getModel());
chartpanel1.setStartRow(0);
chartpanel1.setChartPanel(jPanel11);

绘制曲线:

private void drawGraph(int col) {
jLabel1.setText("");
int count = jTable1.getRowCount();
String[][] chartData1 = new String[1][count];
String[] chartIndex = new String[count];
DefaultTableModel tm = (DefaultTableModel) jTable1.getModel();
for (int i = 0; i < tm.getRowCount(); i++) {
      chartIndex[i] = tm.getValueAt(i, 0) == null ? "" : tm.getValueAt(i, 0).toString();
      chartData1[0][i] = tm.getValueAt(i, col) == null ? "" : tm.getValueAt(i, col).toString();
    }
    if (chartpanel1 != null) {
      chartpanel1.setEditColumn(col);
      chartpanel1.setData(chartData1);
      chartpanel1.setXLab(chartIndex);
      chartpanel1.setTitle(tm.getColumnName(col));
      chartpanel1.setLs_linename(new String[]{tm.getColumnName(col)});
      chartpanel1.getChart();
    }
  }

这个组件有一个缺点。只支持对列进行修改,这是这个组件的一个特点(拖动曲线表格的列会发生改动)。
为了使用它,很多表的结构就不得不迎合这一缺点。

例如如下表结构:

都是按列展示的。对于有些情况很不合理!如何解决(思考中。。。。。。)

上面思考的问题解决了!!!

源码中有这样一个字段:

再使用的过程中会出现如下情况:

这个时候你get哪个model就无所谓了,为了避免影响,随便弄一样不会发生改变的model吧。

这样,拖动曲线的时候,label的值会实时显示曲线的坐标。

那么,给上面的label 加一个监听,改变值的时候,将label的内容用“:”分割开,不刚好是x轴和y轴的值了吗?

对应横向表格中,直接再label监听事件中就可以更改table的值。(完美!!!)

注意一下:有时拖动x轴的坐标是很详细很详细的数据移动,是因为你选这了setIndex而不是setXLab

private void initChartline() {
     //填充 图形
    String[][] ChartData = new String[1][24];
    String[] ChartIndex = new String[24];
    if (fixTable.getRowCount() > 0) {
      for (int i = 0; i < dataTable.getColumnCount() - 2; i++) {
        ChartIndex[i] = String.valueOf(i);
        ChartData[0][i] = dataTable.getValueAt(fixtable_sld, i) == null ? "" : dataTable.getValueAt(fixtable_sld, i).toString();
      }
      if (dchartpanel_1 != null) {
        //String pdate = (String) fixTable.getValueAt(fixTable.getSelectedRow(), 3);
        dchartpanel_1.setLs_linename(new String[]{"联络线曲线" + "ceshi1" + "(MW)"});
        dchartpanel_1.setLcol(Lcol);
        dchartpanel_1.setXLab(ChartIndex);//setXLab 和setIndex的区别在于,setXLab拖动取值x轴是按照下标取值的,而setIndex则是拖动的位置,常常不是整数,推荐用前者
        dchartpanel_1.setData(ChartData);
        //dchartpanel_1.setIndex(ChartIndex);
        dchartpanel_1.getChart();
      }
    }
  }
//曲线颜色
  private java.awt.Color[] Lcol = {
    java.awt.Color.red,
    java.awt.Color.blue,
    java.awt.Color.blue};

它的源码:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.qctc.view.common.frame.pub;

import com.qctc.common.util.period;
import com.qctc.common.Constant;
import com.qctc.view.common.frame.BaseSubTabModule;
import com.qctc.view.common.frame.pub.datasysgraphdrag.datasysgraph;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Administrator
 */
public class DragChartPanel {

  private java.awt.Color[] Lcol = Constant.Lcol;
  private Color bgcolor = new Color(204, 204, 255);//背景色
  private Color rectcolor = Color.white;//图形矩形内颜色

  public DragChartPanel(BaseSubTabModule parentModule, Color bgcolor, Color rectcolor) {
    this.bgcolor = bgcolor;
    this.rectcolor = rectcolor;
    this.parentModule = parentModule;
    initChartPanel();
  }

  public DragChartPanel(BaseSubTabModule parentModule) {
    this.parentModule = parentModule;
    initChartPanel();
  }

  public DragChartPanel() {
    initChartPanel();
  }

  public void initChartPanel() {
    //设置是否翻页
    chart.setMutiPage(false);
    chart.setConvertBool(true);

    //设置底色
    chart.setBackColor(bgcolor);
//    chart.setBackColor(new Color(192,192,192));
    //设置图形区域的边框颜色
    chart.setBorderColor(Color.red);

    //设置图形区域的底色
//    chart.setChartRectColor(new Color(204, 204, 250));
//    if(Constant.SYSTEM_AREA.equals("山西")){
    chart.setChartRectColor(rectcolor);
//    chart.setChartRectColor(new Color(74,74,107));
//    } 

    //设置xy坐标轴颜色
    chart.setXyColor(new Color(30, 30, 30));

    //设置标题颜色
    chart.setTitleColor(new Color(30, 30, 30));

    //设置网格颜色
    chart.setGridColor(new Color(50, 180, 180));

    //设置是否显示网格 1 显示 其他不显示
    chart.setShowHidegrid(1);

    //设置显示点的大小
//    chart.setShowHidep(0);
//    if (Constant.SYSTEM_AREA.equals("山西")) {
    chart.setShowHidep(1);
//    }

    //鼠标移动曲线上是否自动显示横纵坐标十字线
    chart.setshowCrossLine(true);
    //设置鼠标移动曲线显示的十字线颜色
    chart.setCrossLineColor(new Color(150, 180, 150));

    //设置曲线类型:0 连续的曲线 3只显示点
    chart.setLineType(0);

    //设置鼠标提示框框边颜色
    chart.setLwBorderColor(Color.red);
    //设置鼠标显示提示框底色
    chart.setLwColor(Color.yellow);
    //设置鼠标显示提示框提示字的颜色
    chart.setLwTextColor(Color.white);

    //设置横竖网格线条数
    chart.setXzPoints(9);
    chart.setYzPoints(10);

    chartpanel.setLayout(new BorderLayout());
    chartpanel.add(getChart(), java.awt.BorderLayout.CENTER);
    chart.addMouseListener(new java.awt.event.MouseAdapter() {

      public void mousePressed(java.awt.event.MouseEvent evt) {
        dragState = true;
      }

      public void mouseReleased(java.awt.event.MouseEvent evt) {
        dragState = false;
      }
    });
  }

  public boolean isDragState() {
    return dragState;
  }
  private boolean dragState = false;
  protected BaseSubTabModule parentModule;
  private JPanel chartpanel = new JPanel();
  //
  private datasysgraph chart = new datasysgraph();
  //图形参数
  private double maxv = -999999999, minv = 999999999;
  private boolean maxv_zd = true;
  private boolean minv_zd = true;
  private String[][] data = null;
  private String[] ls_linename = null;
  private String title = "";
  private String xtitle = "";
  private String ytitle = "";
  private int xpoints = 12;
  private int xmax = 96;
  private int xmin = 0;
  private String[] index = null;
  private int EditColumn = 0;//拖动关联列
  private int StartRow = 0;//拖动起始行
  private JLabel DragLabel = null;//关联table
  private DefaultTableModel tm = null;//关联的tm
  private boolean sftd = true;
  private int ShowLabelCol = -1;
  private int[] LineShowLabelCols;

  public void setSftd(boolean sftd) {
    this.sftd = sftd;
  }

  public void setShowLabelCol(int ShowLabelCol) {
    this.ShowLabelCol = ShowLabelCol;
  }

  public void setLineShowLabelCols(int[] LineShowLabelCols) {
    this.LineShowLabelCols = LineShowLabelCols;
  }

  public void setTm(DefaultTableModel tm) {
    this.tm = tm;
  }

  public void setDragLabel(JLabel DragLabel) {
    this.DragLabel = DragLabel;
  }

  public void setEditColumn(int EditColumn) {
    this.EditColumn = EditColumn;
  }

  public void setStartRow(int StartRow) {
    this.StartRow = StartRow;
  }

  public void setXtitle(String xtitle) {
    this.xtitle = xtitle;
  }

  public void setYtitle(String ytitle) {
    this.ytitle = ytitle;
  }

  public void setIndex(String[] index) {
    this.index = index;
  }

  public void setData(String[][] data) {
    this.data = data;
  }

  public void setLs_linename(String[] ls_linename) {
    this.ls_linename = ls_linename;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public datasysgraph getChart() {
    try {
      createChart();

      return chart;
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  }

  public datasysgraph getChartByColor(Color[] col) {
    try {
      createChartByColor(col);

      return chart;
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  }

  /**
   * 设置chart要加入的JPanel
   * @param panel
   */
  public void setChartPanel(JPanel panel) {
    Container parent = chartpanel.getParent();
    if (parent != null) {
      parent.removeAll();
    }
    panel.add(chartpanel);
    panel.setMinimumSize(new Dimension(300, 100));
  }

  private void createChart() {
    setMaxMin(this.data);
    setPara();
    setDragPara();
    setXY();
    buildChart();
  }

  private void createChartByColor(Color[] col) {
    setMaxMin(this.data);
    setPara();
    setDragPara();
    setXY();
    buildChartByColor(col);
  }

  /**
   * 生成图
   */
  private void buildChart() {
    try {
      if (this.data != null) {
        int len = this.data.length;
        for (int i = 0; i < len; i++) {
          chart.AddItem(ls_linename[i], data[i].length,
              this.Lcol[i]);
          chart.setPointValue(ls_linename[i], this.index, this.data[i]);
        }
        chart.refresh();
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * 生成图
   */
  private void buildChartByColor(Color[] col) {
    try {
      if (this.data != null) {
        int len = this.data.length;
        for (int i = 0; i < len; i++) {
          chart.AddItem(ls_linename[i], data[i].length,
              col[i]);
          chart.setPointValue(ls_linename[i], this.index, this.data[i]);
        }
        chart.refresh();
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * 设置参数
   */
  private void setPara() {
    try {
      chart.ClearAll();
      chart.setTitle(this.title);
      chart.setLtitlex(this.xtitle);
      chart.setLtitley(this.ytitle);
      chart.setMutiPage(false);
      chart.setYbzzb(this.getMaxv(), this.getMinv());
      chart.setShowLabelCol(ShowLabelCol);
      chart.setLineShowLabelCols(LineShowLabelCols);

    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  private void setDragPara() {
    // 拖动数据列设置
    chart.setEditColumn(this.EditColumn);
    // 拖动起始行设置
    chart.setStartIndex(this.StartRow);
    chart.setJlabel(this.DragLabel);
    // 是否 实现拖动 设置
    chart.setIsDrag(this.sftd);
    chart.setTableDataModel(this.tm);
  }
  private String[] XLab = null;

  /**
   * 设置 图形x轴标签
   * @param XLab
   */
  public void setXLab(String[] XLab) {
    this.XLab = XLab;
  }

  public void setXpoints(int xpoints) {
    this.xpoints = xpoints;
  }
  /**
   * x轴显示坐标间隔点数
   */
  private int XTabN = 10;

  /**
   * 设置xy轴
   */
  private void setXY() {
    try {
      chart.setXzPoints(this.xpoints);//x轴 分割线
      chart.setXmin(this.xmin);

      if (XLab == null) {
        chart.setXmax(this.xmax);

        this.xpoints = 12;
        period period1 = new period();
        String[] ls_pd = new String[97];
        for (int i = 0; i < 96; i++) {
          ls_pd[i] = period1.getPeriod()[i];
        }
        ls_pd[96] = "24:00";

        for (int i = 0; i <= 12; i++) {
          if (i == 0) {
            chart.SetXlab(i, ls_pd[i]);
          } else {
            chart.SetXlab(i, ls_pd[i * 8]);
          }
        }
        chart.setConvertBool(true);
        chart.setdxLab(ls_pd);
      } else {

        int len = this.data[0].length;
        this.XTabN = len / 8 + 1;
        this.xpoints = len / this.XTabN + 1;
        chart.setXzPoints(this.xpoints);//x轴 分割线

        this.index = new String[len];
        for (int i = 0; i < len; i++) {
          index[i] = String.valueOf(i);
        }

        this.xmax = this.xpoints * this.XTabN;
        chart.setXmax(this.xmax);

        String[] TmXLab = new String[this.xmax];
        for (int i = 0; i < this.xmax; i++) {
          if (i < XLab.length) {
            TmXLab[i] = XLab[i];
          } else {
            TmXLab[i] = "";
          }
        }

        for (int i = 0; i < this.xpoints; i++) {
          if (i * this.XTabN < len) {
            chart.SetXlab(i, TmXLab[i * this.XTabN]);
          } else {
            chart.SetXlab(i, "");
          }
        }
        chart.SetXlab(this.xpoints, " ");

        chart.setConvertBool(true);
        chart.setdxLab(TmXLab);

      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * 获取最值
   * @param data
   */
  private void setMaxMin(String[][] data) {
    if (this.maxv_zd) {
      this.maxv = -999999999;
      try {
        if (data != null) {
          for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
              if (data[i][j] != null && !data[i][j].equals("")) {
                try {
                  double maxdd = Double.parseDouble( (data[i][j] == null || "null".equals(data[i][j]) || "".equals(data[i][j])) ? "0" : data[i][j]);
                  if ( maxdd > getMaxv()) {
                    this.maxv = maxdd;
                  }
                } catch (Exception e1) {
                  e1.printStackTrace();
                }
              }
            }
          }
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
      if (getMaxv() == -999999999) {
        this.maxv = 100;
      } else {
        if (getMaxv() > 0) {
          this.maxv = getMaxv() * 1.05;
        } else {
          this.maxv = getMaxv() * 0.95;
        }
      }
    }

    if (this.minv_zd) {
      this.minv = 999999999;
      try {
        if (data != null) {
          for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
              if (data[i][j] != null && !data[i][j].equals("")) {
                try {
                  double mindd = Double.parseDouble( (data[i][j] == null || "null".equals(data[i][j]) || "".equals(data[i][j])) ? "0" : data[i][j]);
                  if (mindd < getMinv()) {
                    this.minv = mindd;
                  }
                } catch (Exception e1) {
                  e1.printStackTrace();
                }
              }
            }
          }
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
      if (getMinv() == 999999999) {
        this.minv = 0;
      } else {
        if (getMinv() > 0) {
          this.minv = getMinv() * 0.95;
        } else {
          this.minv = getMinv() * 1.05;
        }
      }
    }
  }

  /**
   * @return the Lcol
   */
  public java.awt.Color[] getLcol() {
    return Lcol;
  }

  /**
   * @param Lcol the Lcol to set
   */
  public void setLcol(java.awt.Color[] Lcol) {
    this.Lcol = Lcol;
  }

  /**
   * @return the maxv
   */
  public double getMaxv() {
    return maxv;
  }

  /**
   * @param maxv the maxv to set
   */
  public void setMaxv(double maxv) {
    this.maxv = maxv;
    this.maxv_zd = false;
  }

  /**
   * @return the minv
   */
  public double getMinv() {
    return minv;
  }

  /**
   * @param minv the minv to set
   */
  public void setMinv(double minv) {
    this.minv = minv;
    this.minv_zd = false;
  }

  /**
   * 返回修改的曲线数据
   * 2013-04-08 hwh
   * @return
   */
  public double[] getGraphDataY() {
    return chart.getGraphDataY();
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java实现拖拽列表项的排序功能

    在一些允许用户自定义栏目顺序的app(如:凤凰新闻.网易云音乐等),我们可以方便地拖拽列表项来完成列表的重新排序,进而完成对栏目顺序的重排.这个功能很人性化,而实现起来其实很简单(甚至都不用写什么后台代码),只有三步. ①把冰箱门打开 首先,我们需要让冰箱的大门敞开,也就是允许我们进行拖拽的相关操作.以ListView为例,注意下面几个属性. <StackPanel> <ListView x:Name="list" AllowDrop="True"

  • java swing中实现拖拽功能示例

    java实现拖拽示例 Swing中实现拖拽功能,代码很简单,都有注释,自己看,运行效果如下图: 复制代码 代码如下: package com; import java.awt.*;import java.awt.datatransfer.DataFlavor;import java.awt.dnd.DnDConstants;import java.awt.dnd.DropTarget;import java.awt.dnd.DropTargetAdapter;import java.awt.dn

  • Java实现鼠标拖拽移动界面组件

    默认的,Frame或者JFrame自身已经实现了鼠标拖拽标题栏移动窗口的功能. 只是,当你不满意java的JFrame样式,隐藏了标题栏和边框,又或者干脆直接使用JWindow,那你又该怎么实现鼠标拖拽移动窗口的目的呢?最开始,我简单的在mouseDragged方法里frame.setLocation(e.getX(), e.getY()),结果,frame拖拽的时候不停地闪烁,位置在屏幕上不断跳动.后来网上查资料,找到了答案. 这里给一个简单的示例,一看就明白: package com.jeb

  • DragChartPanel可拖拽曲线应用详解

    DragChartPanel  是java cs架构中的一种图形展现的开源组件. 业务需求需要用到DragChartPanel  ,这是一种根据jtable表格中的数据给与展示的图形组件.它和其他图形组件区别再与它可以进行拖拽,用户通过它不仅可以看出数据变化的曲线,而且可以通过拖拽修改表格中的数据. 下面展示一下它的效果图: 丑归丑,但是很实用呀. 下面展示它的代码 初始化坐标格图: chartpanel1 = new DragChartPanel(this); chartpanel1.setX

  • 基于javascript的拖拽类封装详解

    效果图如下 github地址如下: github地址 使用方法 引入js和对应的css import Drag from '../../static/dragger.js' import './assets/css/dragger.css' 之后,实例化 new Drag({ id: 'box-dragger', showAngle: true, isScale: false, showBorder: false }) new Drag({ id: 'box-dragger2', canZoom

  • Qt利用QDrag实现拖拽拼图功能详解

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 main.cpp 4.1 mainwindow.h头文件 4.2 mainwindow.cpp源文件 4.3 PiecesList类 4.4 PuzzleWidget类 五.效果演示 一.项目介绍 本文介绍利用QDrag类实现拖拽拼图功能.左边是打散的图,拖动到右边进行复现,此外程序还支持手动拖入原图片. 二.项目基本配置 新建一个Qt案例,项目名称为“puzzle”,基类选择“QMainWindow”,取消选中创建

  • vue3使用自定义指令实现el dialog拖拽功能示例详解

    目录 实现el-dialog的拖拽功能 通过自定义指令实现拖拽功能 实现拖拽功能 使用方式 实现el-dialog的拖拽功能 这里指的是 element-plus 的el-dialog组件,一开始该组件并没有实现拖拽的功能,当然现在可以通过设置属性的方式实现拖拽. 自带的拖拽功能非常严谨,拖拽时判断是否拖拽出窗口,如果出去了会阻止拖拽. 如果自带的拖拽功能可以满足需求的话,可以跳过本文. 通过自定义指令实现拖拽功能 因为要自己操作dom(设置事件),所以感觉还是使用自定义指令更直接一些,而且对原

  • React实现卡片拖拽效果流程详解

    前提摘要: 学习宋一玮 React 新版本 + 函数组件 &Hooks 优先 开篇就是函数组件+Hooks 实现的效果如下: 学到第11篇了 照葫芦画瓢,不过老师在讲解的过程中没有考虑拖拽目标项边界问题,我稍微处理了下这样就实现拖拽流畅了 下面就是主要的代码了,实现拖拽(src/App.js): 核心在于标记当前项,来源项,目标项,并且在拖拽完成时对数据处理,更新每一组数据(useState): /** @jsxImportSource @emotion/react */ // 上面代码是使用e

  • JS面向对象编程实现的拖拽功能案例详解

    本文实例讲述了JS面向对象编程实现的拖拽功能.分享给大家供大家参考,具体如下: 原始的面向过程代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style> #box { width: 100px; height: 100px; background: blue; position: absolute; } </style> <title>

  • Python+pyecharts绘制双动态曲线教程详解

    总体跟官方样例相似,但是官方样例因为部分代码有误无法运行,同时需要了解json,以及前后端知识需要一些时间,因此供大家参考. 这个是views def line_base() -> Line: line = ( Line() .add_xaxis(list(range(10))) .add_yaxis(series_name="专注度", y_axis=[randrange(0, 100) for _ in range(10)],areastyle_opts=opts.AreaS

  • JS前端使用canvas动态绘制函数曲线示例详解

    目录 前言 第一步:绘制坐标系 1.如何确定 x 轴和 y 轴的边界值 2.不是传入多少网格数就是多少网格 3.如何让坐标原点位于画布中心 4.刻度总是会有浮点数 第二步:画函数曲线 第三步:绘制辅助线和交点坐标 第四步:平移 第五步:缩放 第六步:动态绘制曲线 第七步:模糊到高清 前言 不说废话,我们直入主题.先来看看读了这篇文章你将得到什么,就是下面这个东西啦(是不是很清晰很顺滑): 那具体要做什么呢,我们来简单拆解一下步骤: 绘制坐标系 绘制多条函数曲线 绘制辅助线和坐标点 支持平移.缩放

  • js实现鼠标拖拽缩放div实例代码

    封装为了jq插件,如下 drag.js ;(function ($) { $.fn.dragDiv = function (options) { var def = { maxW:600,// 可伸缩的最大宽度 minW:50// 可伸缩的最小宽度 };// 参数默认值 var opts = $.extend(def,options);// 扩展参数,使用默认值或传参 //设置最大/最小宽度 var max_width = opts.maxW, min_width = opts.minW; //

  • 原生js实现拖拽功能基本思路详解

    如果要设置物体拖拽,那么必须使用三个事件,并且这三个事件的使用顺序不能颠倒. 1.onmousedown:鼠标按下事件 2.onmousemove:鼠标移动事件 3.onmouseup:鼠标抬起事件 拖拽的基本原理就是根据鼠标的移动来移动被拖拽的元素.鼠标的移动也就是x.y坐标的变化;元素的移动就是style.position的 top和left的改变.当然,并不是任何时候移动鼠标都要造成元素的移动,而应该判断鼠标左键的状态是否为按下状态,是否是在可拖拽的元素上按下的. 基本思路如下: 拖拽状态

随机推荐