mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
修正了代码格式
This commit is contained in:
@@ -62,7 +62,7 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement
|
||||
private int currentQueryTimeout;
|
||||
private int currentFetchDirection;
|
||||
private int currentFetchSize;
|
||||
|
||||
|
||||
private final static Log LOG = LogFactory.getLog(DruidPooledPreparedStatement.class);
|
||||
|
||||
public DruidPooledPreparedStatement(DruidPooledConnection conn, PreparedStatementHolder holder) throws SQLException{
|
||||
@@ -76,9 +76,9 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement
|
||||
defaultMaxRows = stmt.getMaxRows();
|
||||
defaultQueryTimeout = stmt.getQueryTimeout();
|
||||
try {
|
||||
defaultFetchDirection = stmt.getFetchDirection();
|
||||
}catch(Exception e) {
|
||||
LOG.warn(e.getMessage(), e);
|
||||
defaultFetchDirection = stmt.getFetchDirection();
|
||||
} catch (Exception e) {
|
||||
LOG.warn(e.getMessage(), e);
|
||||
}
|
||||
defaultFetchSize = stmt.getFetchSize();
|
||||
currentMaxFieldSize = defaultMaxFieldSize;
|
||||
@@ -188,7 +188,7 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement
|
||||
conn.beforeExecute();
|
||||
try {
|
||||
ResultSet rs = stmt.executeQuery();
|
||||
|
||||
|
||||
if (rs == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -469,7 +469,7 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement
|
||||
if (holder.getHitCount() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
int fetchRowPeak = holder.getFetchRowPeak();
|
||||
|
||||
if (fetchRowPeak < 0) {
|
||||
@@ -1012,7 +1012,7 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T> T unwrap(Class<T> iface) throws SQLException {
|
||||
if (iface == PreparedStatement.class) {
|
||||
@@ -1021,11 +1021,11 @@ public class DruidPooledPreparedStatement extends DruidPooledStatement implement
|
||||
}
|
||||
return (T) stmt;
|
||||
}
|
||||
|
||||
|
||||
if (iface == PreparedStatementHolder.class) {
|
||||
return (T) this.holder;
|
||||
}
|
||||
|
||||
|
||||
return super.unwrap(iface);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,74 +33,74 @@ import com.alibaba.druid.support.jconsole.util.TableDataProcessor.ColumnData;
|
||||
* service的请求地址:/datasource.json
|
||||
*
|
||||
* 请求service返回的json格式:
|
||||
* <pre>
|
||||
* {"ResultCode":1,
|
||||
* "Content":
|
||||
* [{"Identity":31375837,"Name":"DataSource-31375837","DbType":"mysql",
|
||||
* "DriverClassName":"com.mysql.jdbc.Driver",
|
||||
* "URL":"jdbc:mysql://localhost:3306/dragoon_v25_masterdb","UserName":"root",
|
||||
* "FilterClassNames":["com.alibaba.druid.filter.stat.StatFilter"],
|
||||
* "WaitThreadCount":0,"NotEmptyWaitCount":0,"NotEmptyWaitMillis":0,"PoolingCount":1,
|
||||
* "PoolingPeak":0,"ActiveCount":0,"ActivePeak":1,"ActivePeakTime":"Tue Aug 21 21:22:33 CST 2012",
|
||||
* "InitialSize":1,"MinIdle":1,"MaxActive":20,"QueryTimeout":0,"TransactionQueryTimeout":0,
|
||||
* "LoginTimeout":0,"ValidConnectionCheckerClassName":"com.alibaba.druid.pool.vendor.MySqlValidConnectionChecker",
|
||||
* "ExceptionSorterClassName":"com.alibaba.druid.pool.vendor.MySqlExceptionSorter",
|
||||
* "TestOnBorrow":false,"TestOnReturn":false,"TestWhileIdle":true,"DefaultAutoCommit":true,
|
||||
* "DefaultReadOnly":true,"LogicConnectCount":93,"LogicCloseCount":93,"LogicConnectErrorCount":0,
|
||||
* "PhysicalConnectCount":1,"PhysicalCloseCount":0,"PhysicalConnectErrorCount":0,
|
||||
* "ExecuteCount":93,"ErrorCount":0,"CommitCount":0,"RollbackCount":0,"PSCacheAccessCount":31,
|
||||
* "PSCacheHitCount":30,"PSCacheMissCount":1,"StartTransactionCount":0,
|
||||
* "TransactionHistogram":[0,0,0,0,0,0],"ConnectionHoldTimeHistogram":[0,0,48,45,0,0,0,0],
|
||||
* "RemoveAbandoned":false
|
||||
* }]
|
||||
* "Content":
|
||||
* [{"Identity":31375837,"Name":"DataSource-31375837","DbType":"mysql",
|
||||
* "DriverClassName":"com.mysql.jdbc.Driver",
|
||||
* "URL":"jdbc:mysql://localhost:3306/dragoon_v25_masterdb","UserName":"root",
|
||||
* "FilterClassNames":["com.alibaba.druid.filter.stat.StatFilter"],
|
||||
* "WaitThreadCount":0,"NotEmptyWaitCount":0,"NotEmptyWaitMillis":0,"PoolingCount":1,
|
||||
* "PoolingPeak":0,"ActiveCount":0,"ActivePeak":1,"ActivePeakTime":"Tue Aug 21 21:22:33 CST 2012",
|
||||
* "InitialSize":1,"MinIdle":1,"MaxActive":20,"QueryTimeout":0,"TransactionQueryTimeout":0,
|
||||
* "LoginTimeout":0,"ValidConnectionCheckerClassName":"com.alibaba.druid.pool.vendor.MySqlValidConnectionChecker",
|
||||
* "ExceptionSorterClassName":"com.alibaba.druid.pool.vendor.MySqlExceptionSorter",
|
||||
* "TestOnBorrow":false,"TestOnReturn":false,"TestWhileIdle":true,"DefaultAutoCommit":true,
|
||||
* "DefaultReadOnly":true,"LogicConnectCount":93,"LogicCloseCount":93,"LogicConnectErrorCount":0,
|
||||
* "PhysicalConnectCount":1,"PhysicalCloseCount":0,"PhysicalConnectErrorCount":0,
|
||||
* "ExecuteCount":93,"ErrorCount":0,"CommitCount":0,"RollbackCount":0,"PSCacheAccessCount":31,
|
||||
* "PSCacheHitCount":30,"PSCacheMissCount":1,"StartTransactionCount":0,
|
||||
* "TransactionHistogram":[0,0,0,0,0,0],"ConnectionHoldTimeHistogram":[0,0,48,45,0,0,0,0],
|
||||
* "RemoveAbandoned":false
|
||||
* }]
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @author yunnysunny<yunnysunny@gmail.com>
|
||||
* */
|
||||
public class DruidDataSourcePanel extends DruidPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final String REQUEST_URL = "/datasource.json";
|
||||
private static final String KEY_WORD_IDENTITY = "Identity";
|
||||
private JPanel contentPanel;
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final String REQUEST_URL = "/datasource.json";
|
||||
private static final String KEY_WORD_IDENTITY = "Identity";
|
||||
private JPanel contentPanel;
|
||||
|
||||
public DruidDataSourcePanel() {
|
||||
super();
|
||||
this.url = REQUEST_URL;
|
||||
|
||||
}
|
||||
public DruidDataSourcePanel(){
|
||||
super();
|
||||
this.url = REQUEST_URL;
|
||||
|
||||
private void addTable(ColumnData columnData) {
|
||||
ArrayList<ArrayList<LinkedHashMap<String, Object>>> data
|
||||
= columnData.getTableDatas();
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
ArrayList<String> ids = columnData.getNames();
|
||||
private void addTable(ColumnData columnData) {
|
||||
ArrayList<ArrayList<LinkedHashMap<String, Object>>> data = columnData.getTableDatas();
|
||||
|
||||
for (ArrayList<LinkedHashMap<String, Object>> listNow : data) {
|
||||
|
||||
tableModel = new DruidTableModel(listNow);
|
||||
table.setModel(tableModel);
|
||||
|
||||
String id = ids.get(i);
|
||||
JPanel panelNow = new JPanel(new BorderLayout());
|
||||
panelNow.setBorder((TitledBorder) BorderFactory
|
||||
.createTitledBorder(KEY_WORD_IDENTITY + ":" + id));
|
||||
contentPanel.add(panelNow);
|
||||
|
||||
panelNow.add(table.getTableHeader(),BorderLayout.NORTH);
|
||||
panelNow.add(table);
|
||||
table.getColumnModel().getColumn(0).setCellRenderer(new DruidTableCellRenderer());
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
int i = 0;
|
||||
ArrayList<String> ids = columnData.getNames();
|
||||
|
||||
@Override
|
||||
protected void tableDataProcess(
|
||||
ArrayList<LinkedHashMap<String, Object>> data) {
|
||||
ColumnData columnData = TableDataProcessor.mutilRow2col(data,
|
||||
KEY_WORD_IDENTITY);
|
||||
contentPanel = new JPanel(new GridLayout(0,1));
|
||||
addTable(columnData);
|
||||
for (ArrayList<LinkedHashMap<String, Object>> listNow : data) {
|
||||
|
||||
scrollPane.setViewportView(contentPanel);
|
||||
}
|
||||
tableModel = new DruidTableModel(listNow);
|
||||
table.setModel(tableModel);
|
||||
|
||||
String id = ids.get(i);
|
||||
JPanel panelNow = new JPanel(new BorderLayout());
|
||||
panelNow.setBorder((TitledBorder) BorderFactory.createTitledBorder(KEY_WORD_IDENTITY + ":" + id));
|
||||
contentPanel.add(panelNow);
|
||||
|
||||
panelNow.add(table.getTableHeader(), BorderLayout.NORTH);
|
||||
panelNow.add(table);
|
||||
table.getColumnModel().getColumn(0).setCellRenderer(new DruidTableCellRenderer());
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tableDataProcess(ArrayList<LinkedHashMap<String, Object>> data) {
|
||||
ColumnData columnData = TableDataProcessor.mutilRow2col(data, KEY_WORD_IDENTITY);
|
||||
contentPanel = new JPanel(new GridLayout(0, 1));
|
||||
addTable(columnData);
|
||||
|
||||
scrollPane.setViewportView(contentPanel);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,32 +27,34 @@ import com.alibaba.druid.support.jconsole.util.TableDataProcessor.ColumnData;
|
||||
* 请求地址:/basic.json
|
||||
*
|
||||
* 请求返回的json格式:
|
||||
* <pre>
|
||||
* {"ResultCode":1,"Content":
|
||||
* {"Version":"0.2.6","Drivers":
|
||||
* ["sun.jdbc.odbc.JdbcOdbcDriver","com.alibaba.druid.mock.MockDriver",
|
||||
* "com.mysql.jdbc.Driver","com.alibaba.druid.proxy.DruidDriver"]
|
||||
* }
|
||||
* {"Version":"0.2.6","Drivers":
|
||||
* ["sun.jdbc.odbc.JdbcOdbcDriver","com.alibaba.druid.mock.MockDriver",
|
||||
* "com.mysql.jdbc.Driver","com.alibaba.druid.proxy.DruidDriver"]
|
||||
* }
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @author yunnysunny<yunnysunny@gmail.com>
|
||||
* */
|
||||
public class DruidDriverPanel extends DruidPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final String REQUEST_URL = "/basic.json";
|
||||
|
||||
public DruidDriverPanel() {
|
||||
super();
|
||||
url = REQUEST_URL;
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final String REQUEST_URL = "/basic.json";
|
||||
|
||||
public DruidDriverPanel(){
|
||||
super();
|
||||
url = REQUEST_URL;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tableDataProcess(
|
||||
ArrayList<LinkedHashMap<String, Object>> data) {
|
||||
ColumnData columnData = TableDataProcessor.row2col(data);
|
||||
tableModel = new DruidTableModel(columnData.getDatas());
|
||||
table.setModel(tableModel);
|
||||
table.getColumnModel().getColumn(0).setCellRenderer(new DruidTableCellRenderer());
|
||||
|
||||
scrollPane.setViewportView(table);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
protected void tableDataProcess(ArrayList<LinkedHashMap<String, Object>> data) {
|
||||
ColumnData columnData = TableDataProcessor.row2col(data);
|
||||
tableModel = new DruidTableModel(columnData.getDatas());
|
||||
table.setModel(tableModel);
|
||||
table.getColumnModel().getColumn(0).setCellRenderer(new DruidTableCellRenderer());
|
||||
|
||||
scrollPane.setViewportView(table);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,189 +40,187 @@ import com.alibaba.druid.support.logging.LogFactory;
|
||||
import com.sun.tools.jconsole.JConsoleContext;
|
||||
|
||||
/**
|
||||
* druid面板的抽象类
|
||||
* 在类在实现的时候,通过url地址获取数据,解析此数据,然后显示在界面中
|
||||
* druid面板的抽象类 在类在实现的时候,通过url地址获取数据,解析此数据,然后显示在界面中
|
||||
*
|
||||
* @author yunnysunny<yunnysunny@gmail.com>
|
||||
*/
|
||||
public abstract class DruidPanel extends JPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final long serialVersionUID = 1L;
|
||||
/** 成功的返回码 */
|
||||
protected static final int RESP_SUCCESS_RESULT = 1;
|
||||
/**返回码在json中的键名 */
|
||||
protected static final String RESP_JSON_RESULT_KEY = "ResultCode";
|
||||
protected static final int RESP_SUCCESS_RESULT = 1;
|
||||
/** 返回码在json中的键名 */
|
||||
protected static final String RESP_JSON_RESULT_KEY = "ResultCode";
|
||||
/** 内容在json中的键名 */
|
||||
protected static final String RESP_JSON_CONTENT_KEY = "Content";
|
||||
/** 默认面板刷新的间隔时间 */
|
||||
protected static final long DEFAULT_ACTIVE_TIME = 5*60*1000;
|
||||
/**版权信息字符串 */
|
||||
private static final String COPYRIGHT_STRING = "<html>powered by <a href=\"http://blog.csdn.net/yunnysunny\">yunnysunny</a></html>";
|
||||
|
||||
/**滚动条面板*/
|
||||
protected JScrollPane scrollPane;
|
||||
protected static final long DEFAULT_ACTIVE_TIME = 5 * 60 * 1000;
|
||||
/** 版权信息字符串 */
|
||||
private static final String COPYRIGHT_STRING = "<html>powered by <a href=\"http://blog.csdn.net/yunnysunny\">yunnysunny</a></html>";
|
||||
|
||||
/** 滚动条面板 */
|
||||
protected JScrollPane scrollPane;
|
||||
/** 表格模板 */
|
||||
protected DruidTableModel tableModel;
|
||||
protected DruidTableModel tableModel;
|
||||
/** 表格 */
|
||||
protected JTable table;
|
||||
protected JTable table;
|
||||
/** 版权面板 */
|
||||
protected JPanel copyrightPanel;
|
||||
protected JPanel copyrightPanel;
|
||||
/** json请求的地址 */
|
||||
protected String url;
|
||||
|
||||
protected String url;
|
||||
|
||||
/** 界面刷新的间隔时间,单位为毫秒. */
|
||||
protected long activeTime;
|
||||
/**上次刷新的时间*/
|
||||
protected long lastRefreshTime;
|
||||
private final static Log LOG = LogFactory.getLog(DruidPanel.class);
|
||||
|
||||
protected long activeTime;
|
||||
/** 上次刷新的时间 */
|
||||
protected long lastRefreshTime;
|
||||
private final static Log LOG = LogFactory.getLog(DruidPanel.class);
|
||||
|
||||
/**
|
||||
* 根据传入的刷新时间间隔来初始化.
|
||||
*
|
||||
*
|
||||
* @param activeTime 刷新时间间隔
|
||||
*/
|
||||
protected DruidPanel(long activeTime) {
|
||||
this.activeTime = activeTime;
|
||||
}
|
||||
|
||||
protected DruidPanel(long activeTime){
|
||||
this.activeTime = activeTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化刷新时间间隔为默认值
|
||||
* */
|
||||
protected DruidPanel() {
|
||||
activeTime = DEFAULT_ACTIVE_TIME;
|
||||
*/
|
||||
protected DruidPanel(){
|
||||
activeTime = DEFAULT_ACTIVE_TIME;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 解析调用service后得到JSON数据
|
||||
*
|
||||
*
|
||||
* @param respData 获取到的json对象
|
||||
* @return 返回解析后的数据
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
protected ArrayList<LinkedHashMap<String,Object>> parseData(Object respData) {
|
||||
ArrayList<LinkedHashMap<String,Object>> data = null;
|
||||
if (respData instanceof Map) {
|
||||
LinkedHashMap<String,Object> map = (LinkedHashMap<String, Object>)respData;
|
||||
int rv = (Integer)map.get(RESP_JSON_RESULT_KEY);
|
||||
protected ArrayList<LinkedHashMap<String, Object>> parseData(Object respData) {
|
||||
ArrayList<LinkedHashMap<String, Object>> data = null;
|
||||
if (respData instanceof Map) {
|
||||
LinkedHashMap<String, Object> map = (LinkedHashMap<String, Object>) respData;
|
||||
int rv = (Integer) map.get(RESP_JSON_RESULT_KEY);
|
||||
|
||||
if (rv == RESP_SUCCESS_RESULT) {
|
||||
Object content = map.get(RESP_JSON_CONTENT_KEY);
|
||||
if (content instanceof List) {
|
||||
data = (ArrayList<LinkedHashMap<String, Object>>)content;
|
||||
} else if (content instanceof Map) {
|
||||
LinkedHashMap<String, Object> contentEle
|
||||
= (LinkedHashMap<String, Object>)content;
|
||||
data = new ArrayList<LinkedHashMap<String,Object>>();
|
||||
data.add(contentEle);
|
||||
}
|
||||
}
|
||||
}
|
||||
return data;
|
||||
if (rv == RESP_SUCCESS_RESULT) {
|
||||
Object content = map.get(RESP_JSON_CONTENT_KEY);
|
||||
if (content instanceof List) {
|
||||
data = (ArrayList<LinkedHashMap<String, Object>>) content;
|
||||
} else if (content instanceof Map) {
|
||||
LinkedHashMap<String, Object> contentEle = (LinkedHashMap<String, Object>) content;
|
||||
data = new ArrayList<LinkedHashMap<String, Object>>();
|
||||
data.add(contentEle);
|
||||
}
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 调用service,返回数据
|
||||
*
|
||||
*
|
||||
* @param url service的地址
|
||||
* @param conn MBeanServerConnection对象
|
||||
* @return 调用service后返回的数据
|
||||
* @throws Exception
|
||||
* @throws Exception
|
||||
*/
|
||||
protected Object getData(String url,MBeanServerConnection conn) throws Exception {
|
||||
Object o = null;
|
||||
ObjectName name = new ObjectName(DruidStatService.MBEAN_NAME);
|
||||
|
||||
String result = (String) conn.invoke(name, "service",
|
||||
new String[] { url }, new String[] { String.class.getName() });
|
||||
protected Object getData(String url, MBeanServerConnection conn) throws Exception {
|
||||
Object o = null;
|
||||
ObjectName name = new ObjectName(DruidStatService.MBEAN_NAME);
|
||||
|
||||
String result = (String) conn.invoke(name, "service", new String[] { url },
|
||||
new String[] { String.class.getName() });
|
||||
o = JSONUtils.parse(result);
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug(o.toString());
|
||||
LOG.debug(o.toString());
|
||||
}
|
||||
return o;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 调用完service之后,各个子类对于解析后的数据的具体处理
|
||||
*
|
||||
*
|
||||
* @param data 解析后的数据
|
||||
*/
|
||||
protected abstract void tableDataProcess(ArrayList<LinkedHashMap<String,Object>> data);
|
||||
|
||||
protected abstract void tableDataProcess(ArrayList<LinkedHashMap<String, Object>> data);
|
||||
|
||||
/**
|
||||
* 如果是第一次调用,则生成表格对象;否则根据当前时间来和上次刷新时间的间隔,
|
||||
* 是否大于对象初始化时设定的时间间隔来判断是否刷新表格数据。
|
||||
*
|
||||
*
|
||||
* @param url service的地址
|
||||
* @param conn MBeanServerConnection对象
|
||||
* @throws Exception
|
||||
*/
|
||||
protected void addOrRefreshTable(String url,MBeanServerConnection conn) throws Exception {
|
||||
if (url != null) {
|
||||
boolean needRefresh = false;
|
||||
long timeNow = new Date().getTime();
|
||||
if (scrollPane == null) {
|
||||
table = new JTable();
|
||||
protected void addOrRefreshTable(String url, MBeanServerConnection conn) throws Exception {
|
||||
if (url != null) {
|
||||
boolean needRefresh = false;
|
||||
long timeNow = new Date().getTime();
|
||||
if (scrollPane == null) {
|
||||
table = new JTable();
|
||||
|
||||
scrollPane = new JScrollPane();
|
||||
scrollPane.setAutoscrolls(true);
|
||||
scrollPane.setBorder((TitledBorder)BorderFactory.createTitledBorder("数据区"));
|
||||
|
||||
setLayout(null);
|
||||
scrollPane.setBounds(10, 10, getWidth()-20, getHeight()-80);
|
||||
scrollPane = new JScrollPane();
|
||||
scrollPane.setAutoscrolls(true);
|
||||
scrollPane.setBorder((TitledBorder) BorderFactory.createTitledBorder("数据区"));
|
||||
|
||||
this.add(scrollPane);
|
||||
|
||||
copyrightPanel = new JPanel();
|
||||
copyrightPanel.setBorder((TitledBorder)BorderFactory.createTitledBorder("版权区"));
|
||||
JLabel authorInfo = new JLabel(COPYRIGHT_STRING);
|
||||
copyrightPanel.add(authorInfo);
|
||||
|
||||
this.add(copyrightPanel);
|
||||
copyrightPanel.setBounds(10, getHeight()-60, getWidth()-20, 60);
|
||||
|
||||
needRefresh = true;
|
||||
lastRefreshTime = timeNow;
|
||||
this.addComponentListener(new ComponentListener() {
|
||||
|
||||
@Override
|
||||
public void componentShown(ComponentEvent arg0) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void componentResized(ComponentEvent arg0) {
|
||||
scrollPane.setBounds(10, 10, getWidth()-20,
|
||||
getHeight()-80);
|
||||
copyrightPanel.setBounds(10, getHeight()-60, getWidth()-20, 60);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void componentMoved(ComponentEvent arg0) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void componentHidden(ComponentEvent arg0) {
|
||||
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if (lastRefreshTime + activeTime < timeNow) {
|
||||
needRefresh = true;
|
||||
lastRefreshTime = timeNow;
|
||||
}
|
||||
}
|
||||
if (needRefresh) {
|
||||
LOG.debug("refresh" + timeNow);
|
||||
ArrayList<LinkedHashMap<String, Object>> data = parseData(getData(
|
||||
url, conn));
|
||||
if (data != null) {
|
||||
tableDataProcess(data);
|
||||
}
|
||||
}
|
||||
setLayout(null);
|
||||
scrollPane.setBounds(10, 10, getWidth() - 20, getHeight() - 80);
|
||||
|
||||
} else {
|
||||
// url不存在
|
||||
LOG.warn("url不存在");
|
||||
}
|
||||
this.add(scrollPane);
|
||||
|
||||
copyrightPanel = new JPanel();
|
||||
copyrightPanel.setBorder((TitledBorder) BorderFactory.createTitledBorder("版权区"));
|
||||
JLabel authorInfo = new JLabel(COPYRIGHT_STRING);
|
||||
copyrightPanel.add(authorInfo);
|
||||
|
||||
this.add(copyrightPanel);
|
||||
copyrightPanel.setBounds(10, getHeight() - 60, getWidth() - 20, 60);
|
||||
|
||||
needRefresh = true;
|
||||
lastRefreshTime = timeNow;
|
||||
this.addComponentListener(new ComponentListener() {
|
||||
|
||||
@Override
|
||||
public void componentShown(ComponentEvent arg0) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void componentResized(ComponentEvent arg0) {
|
||||
scrollPane.setBounds(10, 10, getWidth() - 20, getHeight() - 80);
|
||||
copyrightPanel.setBounds(10, getHeight() - 60, getWidth() - 20, 60);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void componentMoved(ComponentEvent arg0) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void componentHidden(ComponentEvent arg0) {
|
||||
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if (lastRefreshTime + activeTime < timeNow) {
|
||||
needRefresh = true;
|
||||
lastRefreshTime = timeNow;
|
||||
}
|
||||
}
|
||||
if (needRefresh) {
|
||||
LOG.debug("refresh" + timeNow);
|
||||
ArrayList<LinkedHashMap<String, Object>> data = parseData(getData(url, conn));
|
||||
if (data != null) {
|
||||
tableDataProcess(data);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
// url不存在
|
||||
LOG.warn("url不存在");
|
||||
}
|
||||
}
|
||||
|
||||
protected Object doInBackground(JConsoleContext context) throws Exception {
|
||||
@@ -230,13 +228,13 @@ public abstract class DruidPanel extends JPanel {
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
protected void doInBackground(MBeanServerConnection conn) {
|
||||
|
||||
|
||||
try {
|
||||
addOrRefreshTable(url,conn);
|
||||
} catch (Exception e) {
|
||||
LOG.warn("", e);
|
||||
}
|
||||
addOrRefreshTable(url, conn);
|
||||
} catch (Exception e) {
|
||||
LOG.warn("", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
package com.alibaba.druid.support.jconsole;
|
||||
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
@@ -33,6 +35,7 @@ import com.alibaba.druid.support.jconsole.model.DruidTableModel;
|
||||
import com.alibaba.druid.support.jconsole.model.GroupableTableHeader;
|
||||
import com.alibaba.druid.support.jconsole.model.GroupableTableHeaderUI;
|
||||
import com.alibaba.druid.support.jconsole.model.RowHeaderTable;
|
||||
|
||||
/**
|
||||
* 请求地址 /sql.json
|
||||
*
|
||||
@@ -79,217 +82,233 @@ import com.alibaba.druid.support.jconsole.model.RowHeaderTable;
|
||||
]
|
||||
}
|
||||
</pre>
|
||||
|
||||
@author yunnysunny<yunnysunny@gmail.com>
|
||||
* */
|
||||
public class DruidSQLPanel extends DruidPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final String REQUEST_URL = "/sql.json";
|
||||
private static final ArrayList<String> SHOW_LIST = new ArrayList<String>() {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final String REQUEST_URL = "/sql.json";
|
||||
private static final ArrayList<String> SHOW_LIST = new ArrayList<String>() {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
{
|
||||
add("SQL");
|
||||
add("ExecuteCount");
|
||||
add("TotalTime");
|
||||
add("InTransactionCount");
|
||||
add("ErrorCount");
|
||||
add("EffectedRowCount");
|
||||
add("FetchRowCount");
|
||||
add("RunningCount");
|
||||
add("ConcurrentMax");
|
||||
add("Histogram");
|
||||
add("EffectedRowCountHistogram");
|
||||
add("ExecuteAndResultHoldTimeHistogram");
|
||||
add("FetchRowCountHistogram");
|
||||
}
|
||||
{
|
||||
add("SQL");
|
||||
add("ExecuteCount");
|
||||
add("TotalTime");
|
||||
add("InTransactionCount");
|
||||
add("ErrorCount");
|
||||
add("EffectedRowCount");
|
||||
add("FetchRowCount");
|
||||
add("RunningCount");
|
||||
add("ConcurrentMax");
|
||||
add("Histogram");
|
||||
add("EffectedRowCountHistogram");
|
||||
add("ExecuteAndResultHoldTimeHistogram");
|
||||
add("FetchRowCountHistogram");
|
||||
}
|
||||
|
||||
};
|
||||
private static final ArrayList<String> REAL_SHOW_LIST = new ArrayList<String>() {
|
||||
};
|
||||
private static final ArrayList<String> REAL_SHOW_LIST = new ArrayList<String>() {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
{
|
||||
add("SQL");
|
||||
add("ExecuteCount");
|
||||
add("TotalTime");
|
||||
add("InTransactionCount");
|
||||
add("ErrorCount");
|
||||
add("EffectedRowCount");
|
||||
add("FetchRowCount");
|
||||
add("RunningCount");
|
||||
add("ConcurrentMax");
|
||||
add("Histogram");
|
||||
add("EffectedRowCountHistogram");
|
||||
add("ExecuteAndResultHoldTimeHistogram");
|
||||
add("FetchRowCountHistogram");
|
||||
}
|
||||
};
|
||||
private static final String HISOGRAM = "Histogram";
|
||||
private static final String Effected_RowCount_HISOGRAM = "EffectedRowCountHistogram";
|
||||
private static final String ExecuteAndResult_Hold_HISOGRAM = "ExecuteAndResultHoldTimeHistogram";
|
||||
private static final String FetchRowCount_HISOGRAM = "FetchRowCountHistogram";
|
||||
private static final ArrayList<String> ARRAY_DATA_MAP = new ArrayList<String>() {
|
||||
private static final long serialVersionUID = 1L;
|
||||
{
|
||||
add(HISOGRAM);
|
||||
add(Effected_RowCount_HISOGRAM);
|
||||
add(ExecuteAndResult_Hold_HISOGRAM);
|
||||
add(FetchRowCount_HISOGRAM);
|
||||
}
|
||||
};
|
||||
private static final int FIST_LIST_OFFSET = 9;
|
||||
{
|
||||
add("SQL");
|
||||
add("ExecuteCount");
|
||||
add("TotalTime");
|
||||
add("InTransactionCount");
|
||||
add("ErrorCount");
|
||||
add("EffectedRowCount");
|
||||
add("FetchRowCount");
|
||||
add("RunningCount");
|
||||
add("ConcurrentMax");
|
||||
add("Histogram");
|
||||
add("EffectedRowCountHistogram");
|
||||
add("ExecuteAndResultHoldTimeHistogram");
|
||||
add("FetchRowCountHistogram");
|
||||
}
|
||||
};
|
||||
private static final String HISOGRAM = "Histogram";
|
||||
private static final String Effected_RowCount_HISOGRAM = "EffectedRowCountHistogram";
|
||||
private static final String ExecuteAndResult_Hold_HISOGRAM = "ExecuteAndResultHoldTimeHistogram";
|
||||
private static final String FetchRowCount_HISOGRAM = "FetchRowCountHistogram";
|
||||
private static final ArrayList<String> ARRAY_DATA_MAP = new ArrayList<String>() {
|
||||
|
||||
private ColumnGroup groupHistogram;
|
||||
private ColumnGroup groupEffectedRowCountHistogram;
|
||||
private ColumnGroup groupExecuteAndResultHoldTimeHistogram;
|
||||
private ColumnGroup groupFetchRowCountHistogram;
|
||||
private ArrayList<Integer> listHistogram;
|
||||
private ArrayList<Integer> listEffectedRowCountHistogram;
|
||||
private ArrayList<Integer> listExecuteAndResultHoldTimeHistogram;
|
||||
private ArrayList<Integer> listFetchRowCountHistogram;
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
{
|
||||
add(HISOGRAM);
|
||||
add(Effected_RowCount_HISOGRAM);
|
||||
add(ExecuteAndResult_Hold_HISOGRAM);
|
||||
add(FetchRowCount_HISOGRAM);
|
||||
}
|
||||
};
|
||||
private static final int FIST_LIST_OFFSET = 9;
|
||||
|
||||
public DruidSQLPanel() {
|
||||
super();
|
||||
this.url = REQUEST_URL;
|
||||
}
|
||||
|
||||
private void addGroupData(String keyNow, int index) {
|
||||
// System.out.println("keyNow:"+keyNow+"index:"+index);
|
||||
if (HISOGRAM.equals(keyNow)) {
|
||||
listHistogram.add(index);
|
||||
} else if (Effected_RowCount_HISOGRAM.equals(keyNow)) {
|
||||
listEffectedRowCountHistogram.add(index);
|
||||
} else if (ExecuteAndResult_Hold_HISOGRAM.equals(keyNow)) {
|
||||
listExecuteAndResultHoldTimeHistogram.add(index);
|
||||
} else if (FetchRowCount_HISOGRAM.equals(keyNow)) {
|
||||
listFetchRowCountHistogram.add(index);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据预处理,将没有用到的数据删除掉,将牵扯到时间分布的数据拆分出来。
|
||||
*
|
||||
* @param data 要处理的数据
|
||||
* @return 最终的处理结果
|
||||
*/
|
||||
private ArrayList<LinkedHashMap<String, Object>> preProcess(
|
||||
ArrayList<LinkedHashMap<String, Object>> data) {
|
||||
groupHistogram = new ColumnGroup(HISOGRAM);
|
||||
groupEffectedRowCountHistogram = new ColumnGroup(Effected_RowCount_HISOGRAM);
|
||||
groupExecuteAndResultHoldTimeHistogram = new ColumnGroup(ExecuteAndResult_Hold_HISOGRAM);
|
||||
groupFetchRowCountHistogram = new ColumnGroup(FetchRowCount_HISOGRAM);
|
||||
listHistogram = new ArrayList<Integer>();
|
||||
listEffectedRowCountHistogram = new ArrayList<Integer>();
|
||||
listExecuteAndResultHoldTimeHistogram = new ArrayList<Integer>();
|
||||
listFetchRowCountHistogram = new ArrayList<Integer>();
|
||||
|
||||
ArrayList<LinkedHashMap<String, Object>> newData
|
||||
= new ArrayList<LinkedHashMap<String, Object>>();
|
||||
int dataIndex = 0;
|
||||
for (LinkedHashMap<String, Object> dataNow : data) {
|
||||
//先把不需要显示的内容删除掉
|
||||
for (Iterator<Entry<String, Object>> it = dataNow.entrySet().iterator(); it.hasNext();) {
|
||||
Entry<String, Object> entry = it.next();
|
||||
if (!SHOW_LIST.contains(entry.getKey())) {
|
||||
it.remove();
|
||||
}
|
||||
}
|
||||
// if (dataIndex==0)
|
||||
// System.out.println(dataNow.toString());
|
||||
int offset = FIST_LIST_OFFSET;
|
||||
|
||||
for (String arrayKey:ARRAY_DATA_MAP) {//把数组数据显示为单个数据
|
||||
Object arrayData = dataNow.get(arrayKey);
|
||||
|
||||
if (arrayData instanceof ArrayList<?>) {
|
||||
|
||||
dataNow.remove(arrayKey);
|
||||
if (dataIndex == 0) {
|
||||
REAL_SHOW_LIST.remove(arrayKey);
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
ArrayList<Integer> arrayDataList = (ArrayList<Integer>)arrayData;
|
||||
for (int j=0,len=arrayDataList.size();j<len;j++) {
|
||||
int a = (j-1 >= 0)?
|
||||
(int)Math.pow(10,j-1)
|
||||
: 0;
|
||||
int b = (int)Math.pow(10,j);
|
||||
String newKey = arrayKey + "-" +a + "~" + b+"ms";
|
||||
|
||||
dataNow.put(newKey, arrayDataList.get(j));
|
||||
if (dataIndex == 0) {
|
||||
REAL_SHOW_LIST.add(newKey);
|
||||
int index = offset+j;
|
||||
addGroupData(arrayKey,index);
|
||||
if (j == len -1) {
|
||||
offset = index+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
}
|
||||
private ColumnGroup groupHistogram;
|
||||
private ColumnGroup groupEffectedRowCountHistogram;
|
||||
private ColumnGroup groupExecuteAndResultHoldTimeHistogram;
|
||||
private ColumnGroup groupFetchRowCountHistogram;
|
||||
private ArrayList<Integer> listHistogram;
|
||||
private ArrayList<Integer> listEffectedRowCountHistogram;
|
||||
private ArrayList<Integer> listExecuteAndResultHoldTimeHistogram;
|
||||
private ArrayList<Integer> listFetchRowCountHistogram;
|
||||
private ArrayList<String> ids;
|
||||
private static final String JSON_ID_NAME = "ID";
|
||||
|
||||
}//end of foreach ARRAY_DATA_MAP
|
||||
dataIndex ++;
|
||||
newData.add(dataNow);
|
||||
}
|
||||
|
||||
return newData;
|
||||
}
|
||||
|
||||
private void addTableGroup() {
|
||||
|
||||
TableColumnModel cm = table.getColumnModel();
|
||||
// System.out.println(SHOW_LIST.size());
|
||||
for(int i : listHistogram) {
|
||||
groupHistogram.add(cm.getColumn(i));
|
||||
}
|
||||
for (int j: listEffectedRowCountHistogram) {
|
||||
groupEffectedRowCountHistogram.add(cm.getColumn(j));
|
||||
}
|
||||
for (int x : listExecuteAndResultHoldTimeHistogram) {
|
||||
groupExecuteAndResultHoldTimeHistogram.add(cm.getColumn(x));
|
||||
}
|
||||
for (int y : listFetchRowCountHistogram) {
|
||||
groupFetchRowCountHistogram.add(cm.getColumn(y));
|
||||
}
|
||||
|
||||
GroupableTableHeader header = (GroupableTableHeader) table. getTableHeader();
|
||||
header.addColumnGroup(groupHistogram);
|
||||
public DruidSQLPanel(){
|
||||
super();
|
||||
this.url = REQUEST_URL;
|
||||
}
|
||||
|
||||
private void addGroupData(String keyNow, int index) {
|
||||
// System.out.println("keyNow:"+keyNow+"index:"+index);
|
||||
if (HISOGRAM.equals(keyNow)) {
|
||||
listHistogram.add(index);
|
||||
} else if (Effected_RowCount_HISOGRAM.equals(keyNow)) {
|
||||
listEffectedRowCountHistogram.add(index);
|
||||
} else if (ExecuteAndResult_Hold_HISOGRAM.equals(keyNow)) {
|
||||
listExecuteAndResultHoldTimeHistogram.add(index);
|
||||
} else if (FetchRowCount_HISOGRAM.equals(keyNow)) {
|
||||
listFetchRowCountHistogram.add(index);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据预处理,将没有用到的数据删除掉,将牵扯到时间分布的数据拆分出来。
|
||||
*
|
||||
* @param data 要处理的数据
|
||||
* @return 最终的处理结果
|
||||
*/
|
||||
private ArrayList<LinkedHashMap<String, Object>> preProcess(ArrayList<LinkedHashMap<String, Object>> data) {
|
||||
groupHistogram = new ColumnGroup(HISOGRAM);
|
||||
groupEffectedRowCountHistogram = new ColumnGroup(Effected_RowCount_HISOGRAM);
|
||||
groupExecuteAndResultHoldTimeHistogram = new ColumnGroup(ExecuteAndResult_Hold_HISOGRAM);
|
||||
groupFetchRowCountHistogram = new ColumnGroup(FetchRowCount_HISOGRAM);
|
||||
listHistogram = new ArrayList<Integer>();
|
||||
listEffectedRowCountHistogram = new ArrayList<Integer>();
|
||||
listExecuteAndResultHoldTimeHistogram = new ArrayList<Integer>();
|
||||
listFetchRowCountHistogram = new ArrayList<Integer>();
|
||||
ids = new ArrayList<String>();
|
||||
|
||||
ArrayList<LinkedHashMap<String, Object>> newData = new ArrayList<LinkedHashMap<String, Object>>();
|
||||
int dataIndex = 0;
|
||||
for (LinkedHashMap<String, Object> dataNow : data) {
|
||||
// 先把不需要显示的内容删除掉
|
||||
for (Iterator<Entry<String, Object>> it = dataNow.entrySet().iterator(); it.hasNext();) {
|
||||
Entry<String, Object> entry = it.next();
|
||||
String key = entry.getKey();
|
||||
Object value = entry.getValue();
|
||||
if (JSON_ID_NAME.equals(key)) {
|
||||
ids.add(value != null ? value.toString() : null);
|
||||
}
|
||||
if (!SHOW_LIST.contains(key)) {
|
||||
it.remove();
|
||||
}
|
||||
}
|
||||
// if (dataIndex==0)
|
||||
// System.out.println(dataNow.toString());
|
||||
int offset = FIST_LIST_OFFSET;
|
||||
|
||||
for (String arrayKey : ARRAY_DATA_MAP) {// 把数组数据显示为单个数据
|
||||
Object arrayData = dataNow.get(arrayKey);
|
||||
|
||||
if (arrayData instanceof ArrayList<?>) {
|
||||
|
||||
dataNow.remove(arrayKey);
|
||||
if (dataIndex == 0) {
|
||||
REAL_SHOW_LIST.remove(arrayKey);
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
ArrayList<Integer> arrayDataList = (ArrayList<Integer>) arrayData;
|
||||
for (int j = 0, len = arrayDataList.size(); j < len; j++) {
|
||||
int a = (j - 1 >= 0) ? (int) Math.pow(10, j - 1) : 0;
|
||||
int b = (int) Math.pow(10, j);
|
||||
String newKey = arrayKey + "-" + a + "~" + b + "ms";
|
||||
|
||||
dataNow.put(newKey, arrayDataList.get(j));
|
||||
if (dataIndex == 0) {
|
||||
REAL_SHOW_LIST.add(newKey);
|
||||
int index = offset + j;
|
||||
addGroupData(arrayKey, index);
|
||||
if (j == len - 1) {
|
||||
offset = index + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
}
|
||||
|
||||
}// end of foreach ARRAY_DATA_MAP
|
||||
dataIndex++;
|
||||
newData.add(dataNow);
|
||||
}
|
||||
|
||||
return newData;
|
||||
}
|
||||
|
||||
private void addTableGroup() {
|
||||
|
||||
TableColumnModel cm = table.getColumnModel();
|
||||
// System.out.println(SHOW_LIST.size());
|
||||
for (int i : listHistogram) {
|
||||
groupHistogram.add(cm.getColumn(i));
|
||||
}
|
||||
for (int j : listEffectedRowCountHistogram) {
|
||||
groupEffectedRowCountHistogram.add(cm.getColumn(j));
|
||||
}
|
||||
for (int x : listExecuteAndResultHoldTimeHistogram) {
|
||||
groupExecuteAndResultHoldTimeHistogram.add(cm.getColumn(x));
|
||||
}
|
||||
for (int y : listFetchRowCountHistogram) {
|
||||
groupFetchRowCountHistogram.add(cm.getColumn(y));
|
||||
}
|
||||
|
||||
GroupableTableHeader header = (GroupableTableHeader) table.getTableHeader();
|
||||
header.addColumnGroup(groupHistogram);
|
||||
header.addColumnGroup(groupEffectedRowCountHistogram);
|
||||
header.addColumnGroup(groupExecuteAndResultHoldTimeHistogram);
|
||||
header.addColumnGroup(groupFetchRowCountHistogram);
|
||||
header.setUI(new GroupableTableHeaderUI());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tableDataProcess(
|
||||
ArrayList<LinkedHashMap<String, Object>> data) {
|
||||
table = new JTable() {
|
||||
private static final long serialVersionUID = 1L;
|
||||
@Override
|
||||
protected void tableDataProcess(ArrayList<LinkedHashMap<String, Object>> data) {
|
||||
table = new JTable() {
|
||||
|
||||
@Override
|
||||
protected JTableHeader createDefaultTableHeader() {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
return new GroupableTableHeader(columnModel);
|
||||
}
|
||||
};
|
||||
data = preProcess(data);
|
||||
// System.out.println(SHOW_LIST);
|
||||
tableModel = new DruidTableModel(data,REAL_SHOW_LIST);
|
||||
// System.out.println(data.toString());
|
||||
table.setModel(tableModel);
|
||||
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
|
||||
addTableGroup();
|
||||
|
||||
RowHeaderTable header = new RowHeaderTable(table,20);
|
||||
scrollPane.setRowHeaderView(header);
|
||||
scrollPane.setViewportView(table);
|
||||
JLabel jb = new JLabel("N",SwingConstants.CENTER);
|
||||
jb.setBorder(new BevelBorder(BevelBorder.RAISED,null,null,null,null));
|
||||
scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER,jb);
|
||||
}
|
||||
@Override
|
||||
protected JTableHeader createDefaultTableHeader() {
|
||||
|
||||
return new GroupableTableHeader(columnModel);
|
||||
}
|
||||
};
|
||||
data = preProcess(data);
|
||||
// System.out.println(SHOW_LIST);
|
||||
tableModel = new DruidTableModel(data, REAL_SHOW_LIST);
|
||||
// System.out.println(data.toString());
|
||||
table.setModel(tableModel);
|
||||
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
|
||||
addTableGroup();
|
||||
table.addMouseListener(new MouseAdapter() {
|
||||
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
if (e.getClickCount() == 2) {// 点击几次,这里是双击事件
|
||||
int row = table.getSelectedRow();
|
||||
String id = ids.get(row);
|
||||
System.out.println(id);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
RowHeaderTable header = new RowHeaderTable(table, 20);
|
||||
scrollPane.setRowHeaderView(header);
|
||||
scrollPane.setViewportView(table);
|
||||
JLabel jb = new JLabel("N", SwingConstants.CENTER);
|
||||
jb.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
|
||||
scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, jb);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Vector;
|
||||
|
||||
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JTable;
|
||||
import javax.swing.UIManager;
|
||||
@@ -12,30 +12,31 @@ import javax.swing.table.DefaultTableCellRenderer;
|
||||
import javax.swing.table.JTableHeader;
|
||||
import javax.swing.table.TableCellRenderer;
|
||||
import javax.swing.table.TableColumn;
|
||||
|
||||
|
||||
public class ColumnGroup {
|
||||
/**合并的JTableHeader的Renderer*/
|
||||
protected TableCellRenderer renderer=null;
|
||||
/**合并的单元格的各个实际的最小单元格存储结构*/
|
||||
protected Vector<Object> vector=null;
|
||||
/**合并后单元格显示的文本信息*/
|
||||
protected String text=null;
|
||||
/**合并的单元格内部两个最小JTableHeader的间隙,其实就是去掉线后那个Border*/
|
||||
private int margin = 0;
|
||||
|
||||
public ColumnGroup(String text) {
|
||||
|
||||
/** 合并的JTableHeader的Renderer */
|
||||
protected TableCellRenderer renderer = null;
|
||||
/** 合并的单元格的各个实际的最小单元格存储结构 */
|
||||
protected Vector<Object> vector = null;
|
||||
/** 合并后单元格显示的文本信息 */
|
||||
protected String text = null;
|
||||
/** 合并的单元格内部两个最小JTableHeader的间隙,其实就是去掉线后那个Border */
|
||||
private int margin = 0;
|
||||
|
||||
public ColumnGroup(String text){
|
||||
this(null, text);
|
||||
}
|
||||
|
||||
public ColumnGroup(TableCellRenderer renderer, String text) {
|
||||
|
||||
public ColumnGroup(TableCellRenderer renderer, String text){
|
||||
if (renderer == null) {
|
||||
this.renderer = new DefaultTableCellRenderer() {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table,
|
||||
Object value, boolean isSelected, boolean hasFocus,
|
||||
int row, int column) {
|
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
|
||||
boolean hasFocus, int row, int column) {
|
||||
JTableHeader header = table.getTableHeader();
|
||||
if (header != null) {
|
||||
setForeground(header.getForeground());
|
||||
@@ -54,33 +55,35 @@ public class ColumnGroup {
|
||||
this.text = text;
|
||||
vector = new Vector<Object>();
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加单元格
|
||||
*
|
||||
* @param obj
|
||||
*/
|
||||
public void add(Object obj) {
|
||||
if (obj == null)
|
||||
return;
|
||||
if (obj == null) return;
|
||||
vector.addElement(obj);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据JTable的某一列取得它的所有的包含列,
|
||||
*
|
||||
* @param column
|
||||
* @param group
|
||||
* @return
|
||||
*/
|
||||
public Vector<ColumnGroup> getColumnGroups(TableColumn column, Vector<ColumnGroup> group) {
|
||||
//通过递归判断列到底属于那个ColumnGroup
|
||||
// 通过递归判断列到底属于那个ColumnGroup
|
||||
group.addElement(this);
|
||||
if (vector.contains(column))
|
||||
return group;
|
||||
if (vector.contains(column)) return group;
|
||||
Enumeration<Object> enumeration = vector.elements();
|
||||
while (enumeration.hasMoreElements()) {
|
||||
Object obj = enumeration.nextElement();
|
||||
if (obj instanceof ColumnGroup) {
|
||||
@SuppressWarnings("unchecked")
|
||||
Vector<ColumnGroup> groups = ((ColumnGroup) obj).getColumnGroups(column,
|
||||
(Vector<ColumnGroup>) group.clone());
|
||||
(Vector<ColumnGroup>) group.clone());
|
||||
if (groups != null) {
|
||||
return groups;
|
||||
}
|
||||
@@ -88,33 +91,35 @@ public class ColumnGroup {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public TableCellRenderer getHeaderRenderer() {
|
||||
return renderer;
|
||||
}
|
||||
|
||||
|
||||
public Object getHeaderValue() {
|
||||
return text;
|
||||
}
|
||||
|
||||
/**
|
||||
* 取得合并后的单元格的大小
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public int getSize() {
|
||||
return vector == null ? 0 : vector.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* 取得合并后的单元格的大小,这个方法需要计算,首先
|
||||
* 是取得一个没有合并的最小单元格的JTableHeader
|
||||
* 的大小,通过Renderer取得组件
|
||||
* 取得合并后的单元格的大小,这个方法需要计算,首先 是取得一个没有合并的最小单元格的JTableHeader 的大小,<br/>
|
||||
* 通过Renderer取得组件
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public Dimension getSize(JTable table) {
|
||||
Component comp = renderer.getTableCellRendererComponent(table,
|
||||
getHeaderValue(), false, false, -1, -1);
|
||||
Component comp = renderer.getTableCellRendererComponent(table, getHeaderValue(), false, false, -1, -1);
|
||||
int height = comp.getPreferredSize().height;
|
||||
int width = 0;
|
||||
//宽度需要计算合并的还要加上间隙
|
||||
// 宽度需要计算合并的还要加上间隙
|
||||
Enumeration<Object> enumeration = vector.elements();
|
||||
while (enumeration.hasMoreElements()) {
|
||||
Object obj = enumeration.nextElement();
|
||||
@@ -128,11 +133,11 @@ public class ColumnGroup {
|
||||
}
|
||||
return new Dimension(width, height);
|
||||
}
|
||||
|
||||
|
||||
public java.lang.String getText() {
|
||||
return text;
|
||||
}
|
||||
|
||||
|
||||
public boolean removeColumn(ColumnGroup ptg, TableColumn tc) {
|
||||
boolean retFlag = false;
|
||||
if (tc != null) {
|
||||
@@ -154,7 +159,7 @@ public class ColumnGroup {
|
||||
}
|
||||
return retFlag;
|
||||
}
|
||||
|
||||
|
||||
public boolean removeColumnGrp(ColumnGroup ptg, ColumnGroup tg) {
|
||||
boolean retFlag = false;
|
||||
if (tg != null) {
|
||||
@@ -170,7 +175,7 @@ public class ColumnGroup {
|
||||
if (retFlag) {
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
} else if (tmpObj instanceof TableColumn) {
|
||||
break;
|
||||
@@ -179,7 +184,7 @@ public class ColumnGroup {
|
||||
}
|
||||
return retFlag;
|
||||
}
|
||||
|
||||
|
||||
public void setColumnMargin(int margin) {
|
||||
this.margin = margin;
|
||||
Enumeration<Object> enumeration = vector.elements();
|
||||
@@ -190,13 +195,13 @@ public class ColumnGroup {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void setHeaderRenderer(TableCellRenderer renderer) {
|
||||
if (renderer != null) {
|
||||
this.renderer = renderer;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void setText(java.lang.String newText) {
|
||||
text = newText;
|
||||
}
|
||||
|
||||
+13
-13
@@ -7,30 +7,30 @@ import javax.swing.JLabel;
|
||||
import javax.swing.JTable;
|
||||
import javax.swing.table.TableCellRenderer;
|
||||
|
||||
public class DruidTableCellRenderer extends JLabel implements TableCellRenderer
|
||||
{
|
||||
/**
|
||||
* @author yunnysunny<yunnysunny@gmail.com>
|
||||
* */
|
||||
public class DruidTableCellRenderer extends JLabel implements TableCellRenderer {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
// This method is called each time a cell in a column
|
||||
// This method is called each time a cell in a column
|
||||
// using this renderer needs to be rendered.
|
||||
public Component getTableCellRendererComponent(JTable table, Object value,
|
||||
boolean isSelected, boolean hasFocus, int row, int column)
|
||||
{
|
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
|
||||
int row, int column) {
|
||||
|
||||
if ((column == 0))
|
||||
{
|
||||
setBackground(Color.lightGray);
|
||||
if ((column == 0)) {
|
||||
setBackground(Color.lightGray);
|
||||
}
|
||||
this.setOpaque(true);
|
||||
|
||||
if (value != null) {
|
||||
setText(value.toString());
|
||||
setText(value.toString());
|
||||
} else {
|
||||
setText((row + 1)+"");
|
||||
setText((row + 1) + "");
|
||||
}
|
||||
|
||||
// Since the renderer is a component, return itself
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,117 +23,120 @@ import javax.swing.table.TableModel;
|
||||
|
||||
/**
|
||||
* 自定义duird监控数据表格模板类
|
||||
*
|
||||
* @author yunnysunny<yunnysunny@gmail.com>
|
||||
*/
|
||||
public class DruidTableModel implements TableModel {
|
||||
|
||||
/** 数据内容. */
|
||||
private ArrayList<LinkedHashMap<String,Object>> list;
|
||||
|
||||
/** 自定义列名集合. */
|
||||
private ArrayList<String> showKeys;
|
||||
|
||||
public DruidTableModel(ArrayList<LinkedHashMap<String, Object>> list) {
|
||||
super();
|
||||
this.list = list;
|
||||
showKeys = null;
|
||||
}
|
||||
/** 数据内容. */
|
||||
private ArrayList<LinkedHashMap<String, Object>> list;
|
||||
|
||||
public DruidTableModel(ArrayList<LinkedHashMap<String, Object>> list,
|
||||
ArrayList<String> showKeys) {
|
||||
super();
|
||||
this.list = list;
|
||||
this.showKeys = showKeys;
|
||||
}
|
||||
/** 自定义列名集合. */
|
||||
private ArrayList<String> showKeys;
|
||||
|
||||
public DruidTableModel(ArrayList<LinkedHashMap<String, Object>> list){
|
||||
super();
|
||||
this.list = list;
|
||||
showKeys = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<?> getColumnClass(int columnIndex) {
|
||||
return String.class;
|
||||
}
|
||||
public DruidTableModel(ArrayList<LinkedHashMap<String, Object>> list, ArrayList<String> showKeys){
|
||||
super();
|
||||
this.list = list;
|
||||
this.showKeys = showKeys;
|
||||
}
|
||||
|
||||
/* 如果设置了列名,就是列名的长度;否则返回数据的第一条LinkedHashmap的长度
|
||||
* @see javax.swing.table.TableModel#getColumnCount()
|
||||
*/
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
int colCount = 0;
|
||||
if (showKeys != null) {
|
||||
colCount = showKeys.size();
|
||||
} else if (list != null) {
|
||||
int listLen = list.size();
|
||||
if (listLen > 0) {
|
||||
colCount = list.get(0).size();
|
||||
}
|
||||
}
|
||||
return colCount;
|
||||
}
|
||||
|
||||
/* 如果设置了自定义列名,则使用自定义列名,并且在返回前拆除掉'-'前面的内容;
|
||||
* 如果没有设置,则返回第一条内容的LinkedHashMap的键名。
|
||||
* @see javax.swing.table.TableModel#getColumnName(int)
|
||||
*/
|
||||
@Override
|
||||
public String getColumnName(int columnIndex) {
|
||||
if (showKeys != null && showKeys.size() > 0) {
|
||||
String keyNow = showKeys.get(columnIndex);
|
||||
if (keyNow != null) {
|
||||
return keyNow.substring(keyNow.indexOf('-')+1, keyNow.length());
|
||||
}
|
||||
}
|
||||
if (list != null && list.size() > 0) {
|
||||
LinkedHashMap<String,Object> firstElement = list.get(0);
|
||||
Object[] keys = firstElement.keySet().toArray();
|
||||
return keys[columnIndex].toString();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public Class<?> getColumnClass(int columnIndex) {
|
||||
return String.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRowCount() {
|
||||
return list.size();
|
||||
}
|
||||
/*
|
||||
* 如果设置了列名,就是列名的长度;否则返回数据的第一条LinkedHashmap的长度
|
||||
* @see javax.swing.table.TableModel#getColumnCount()
|
||||
*/
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
int colCount = 0;
|
||||
if (showKeys != null) {
|
||||
colCount = showKeys.size();
|
||||
} else if (list != null) {
|
||||
int listLen = list.size();
|
||||
if (listLen > 0) {
|
||||
colCount = list.get(0).size();
|
||||
}
|
||||
}
|
||||
return colCount;
|
||||
}
|
||||
|
||||
/* 如果设置了自定义列名,则返回当前列数对应的列名在LinkedHashMap中对应的值;
|
||||
* 否则,返回当前LinkedHashMap在当前列数位置对应的值。
|
||||
* @see javax.swing.table.TableModel#getValueAt(int, int)
|
||||
*/
|
||||
@Override
|
||||
public Object getValueAt(int rowIndex, int columnIndex) {
|
||||
if (list != null && rowIndex < list.size()) {//没有超出最大行数
|
||||
LinkedHashMap<String,Object> dataNow = list.get(rowIndex);
|
||||
if (showKeys != null) {
|
||||
int titleLen = showKeys.size();
|
||||
if (titleLen > 0 && columnIndex < titleLen) {
|
||||
return dataNow.get(showKeys.get(columnIndex));
|
||||
}
|
||||
} else {
|
||||
Object[] values = dataNow.values().toArray();
|
||||
if (columnIndex < values.length) {
|
||||
return values[columnIndex];
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/*
|
||||
* 如果设置了自定义列名,则使用自定义列名,并且在返回前拆除掉'-'前面的内容;
|
||||
* 如果没有设置,则返回第一条内容的LinkedHashMap的键名。
|
||||
* @see javax.swing.table.TableModel#getColumnName(int)
|
||||
*/
|
||||
@Override
|
||||
public String getColumnName(int columnIndex) {
|
||||
if (showKeys != null && showKeys.size() > 0) {
|
||||
String keyNow = showKeys.get(columnIndex);
|
||||
if (keyNow != null) {
|
||||
return keyNow.substring(keyNow.indexOf('-') + 1, keyNow.length());
|
||||
}
|
||||
}
|
||||
if (list != null && list.size() > 0) {
|
||||
LinkedHashMap<String, Object> firstElement = list.get(0);
|
||||
Object[] keys = firstElement.keySet().toArray();
|
||||
return keys[columnIndex].toString();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCellEditable(int rowIndex, int columnIndex) {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public int getRowCount() {
|
||||
return list.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addTableModelListener(TableModelListener l) {
|
||||
|
||||
}
|
||||
/*
|
||||
* 如果设置了自定义列名,则返回当前列数对应的列名在LinkedHashMap中对应的值;
|
||||
* 否则,返回当前LinkedHashMap在当前列数位置对应的值。
|
||||
* @see javax.swing.table.TableModel#getValueAt(int, int)
|
||||
*/
|
||||
@Override
|
||||
public Object getValueAt(int rowIndex, int columnIndex) {
|
||||
if (list != null && rowIndex < list.size()) {// 没有超出最大行数
|
||||
LinkedHashMap<String, Object> dataNow = list.get(rowIndex);
|
||||
if (showKeys != null) {
|
||||
int titleLen = showKeys.size();
|
||||
if (titleLen > 0 && columnIndex < titleLen) {
|
||||
return dataNow.get(showKeys.get(columnIndex));
|
||||
}
|
||||
} else {
|
||||
Object[] values = dataNow.values().toArray();
|
||||
if (columnIndex < values.length) {
|
||||
return values[columnIndex];
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeTableModelListener(TableModelListener l) {
|
||||
|
||||
}
|
||||
@Override
|
||||
public boolean isCellEditable(int rowIndex, int columnIndex) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
|
||||
|
||||
}
|
||||
@Override
|
||||
public void addTableModelListener(TableModelListener l) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeTableModelListener(TableModelListener l) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,35 +2,35 @@ package com.alibaba.druid.support.jconsole.model;
|
||||
|
||||
import java.util.Enumeration;
|
||||
import java.util.Vector;
|
||||
|
||||
|
||||
import javax.swing.table.JTableHeader;
|
||||
import javax.swing.table.TableColumn;
|
||||
import javax.swing.table.TableColumnModel;
|
||||
|
||||
|
||||
public class GroupableTableHeader extends JTableHeader {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
// private static final String uiClassID = "GroupableTableHeaderUI";
|
||||
protected Vector<ColumnGroup> columnGroups = null;
|
||||
|
||||
public GroupableTableHeader(TableColumnModel model) {
|
||||
private static final long serialVersionUID = 1L;
|
||||
// private static final String uiClassID = "GroupableTableHeaderUI";
|
||||
protected Vector<ColumnGroup> columnGroups = null;
|
||||
|
||||
public GroupableTableHeader(TableColumnModel model){
|
||||
super(model);
|
||||
setUI(new GroupableTableHeaderUI());
|
||||
setReorderingAllowed(false);
|
||||
setRequestFocusEnabled(false);
|
||||
}
|
||||
|
||||
|
||||
public void addColumnGroup(ColumnGroup g) {
|
||||
if (columnGroups == null) {
|
||||
columnGroups = new Vector<ColumnGroup>();
|
||||
}
|
||||
columnGroups.addElement(g);
|
||||
}
|
||||
|
||||
|
||||
public void clearColumnGroups() {
|
||||
columnGroups = null;
|
||||
}
|
||||
|
||||
|
||||
public ColumnGroup[] getColumnGroups() {
|
||||
ColumnGroup[] retg = null;
|
||||
if (columnGroups.size() > 0) {
|
||||
@@ -39,8 +39,8 @@ public class GroupableTableHeader extends JTableHeader {
|
||||
}
|
||||
return retg;
|
||||
}
|
||||
|
||||
public Enumeration<ColumnGroup> getColumnGroups(TableColumn col) {
|
||||
|
||||
public Enumeration<ColumnGroup> getColumnGroups(TableColumn col) {
|
||||
if (columnGroups == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -54,11 +54,11 @@ public class GroupableTableHeader extends JTableHeader {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public boolean isFocusTraversable() {
|
||||
return super.isFocusTraversable() && isRequestFocusEnabled();
|
||||
}
|
||||
|
||||
|
||||
public void setColumnMargin() {
|
||||
if (columnGroups == null) {
|
||||
return;
|
||||
@@ -70,7 +70,7 @@ public class GroupableTableHeader extends JTableHeader {
|
||||
cGroup.setColumnMargin(columnMargin);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void setReorderingAllowed(boolean b) {
|
||||
reorderingAllowed = b;
|
||||
}
|
||||
|
||||
+48
-56
@@ -7,7 +7,7 @@ import java.awt.Rectangle;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Vector;
|
||||
|
||||
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JTable;
|
||||
@@ -18,10 +18,11 @@ import javax.swing.table.JTableHeader;
|
||||
import javax.swing.table.TableCellRenderer;
|
||||
import javax.swing.table.TableColumn;
|
||||
import javax.swing.table.TableColumnModel;
|
||||
|
||||
|
||||
public class GroupableTableHeaderUI extends BasicTableHeaderUI {
|
||||
|
||||
private int m_height;
|
||||
|
||||
|
||||
private Dimension createHeaderSize(long width) {
|
||||
TableColumnModel columnModel = header.getColumnModel();
|
||||
width += columnModel.getColumnMargin() * columnModel.getColumnCount();
|
||||
@@ -30,7 +31,7 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI {
|
||||
}
|
||||
return new Dimension((int) width, getHeaderHeight());
|
||||
}
|
||||
|
||||
|
||||
private int getColCountUnderColGroup(ColumnGroup cg, int iCount) {
|
||||
Vector<Object> v = cg.vector;
|
||||
for (int i = 0; i < v.size(); i++) {
|
||||
@@ -43,7 +44,7 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI {
|
||||
}
|
||||
return iCount;
|
||||
}
|
||||
|
||||
|
||||
public int getHeaderHeight() {
|
||||
int height = 0;
|
||||
TableColumnModel columnModel = header.getColumnModel();
|
||||
@@ -52,12 +53,12 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI {
|
||||
TableCellRenderer renderer = aColumn.getHeaderRenderer();
|
||||
if (renderer == null) {
|
||||
renderer = new DefaultTableCellRenderer() {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(
|
||||
JTable table, Object value, boolean isSelected,
|
||||
boolean hasFocus, int row, int column) {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
|
||||
boolean hasFocus, int row, int column) {
|
||||
JTableHeader header = table.getTableHeader();
|
||||
if (header != null) {
|
||||
setForeground(header.getForeground());
|
||||
@@ -71,16 +72,13 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI {
|
||||
}
|
||||
};
|
||||
}
|
||||
Component comp = renderer.getTableCellRendererComponent(header
|
||||
.getTable(), aColumn.getHeaderValue(), false, false, -1,
|
||||
column);
|
||||
Component comp = renderer.getTableCellRendererComponent(header.getTable(), aColumn.getHeaderValue(), false,
|
||||
false, -1, column);
|
||||
int cHeight = comp.getPreferredSize().height;
|
||||
Enumeration<ColumnGroup> enumeration = ((GroupableTableHeader) header)
|
||||
.getColumnGroups(aColumn);
|
||||
Enumeration<ColumnGroup> enumeration = ((GroupableTableHeader) header).getColumnGroups(aColumn);
|
||||
if (enumeration != null) {
|
||||
while (enumeration.hasMoreElements()) {
|
||||
ColumnGroup cGroup = (ColumnGroup) enumeration
|
||||
.nextElement();
|
||||
ColumnGroup cGroup = (ColumnGroup) enumeration.nextElement();
|
||||
cHeight += cGroup.getSize(header.getTable()).height;
|
||||
}
|
||||
}
|
||||
@@ -89,19 +87,19 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI {
|
||||
height = Math.max(height, m_height);
|
||||
return height;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Dimension getPreferredSize(JComponent c) {
|
||||
long width = 0;
|
||||
Enumeration<TableColumn> enumeration = header.getColumnModel().getColumns();
|
||||
while (enumeration.hasMoreElements()) {
|
||||
TableColumn aColumn = enumeration.nextElement();
|
||||
TableColumn aColumn = enumeration.nextElement();
|
||||
width = width + aColumn.getWidth();
|
||||
}
|
||||
|
||||
|
||||
return createHeaderSize(width);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void paint(Graphics g, JComponent c) {
|
||||
Rectangle clipBounds = g.getClipBounds();
|
||||
@@ -114,26 +112,23 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI {
|
||||
Rectangle cellRect = new Rectangle(0, 0, size.width, size.height);
|
||||
Hashtable<ColumnGroup, Rectangle> h = new Hashtable<ColumnGroup, Rectangle>();
|
||||
int columnMargin = header.getColumnModel().getColumnMargin();
|
||||
Enumeration<TableColumn> enumeration = header.getColumnModel().getColumns();
|
||||
Enumeration<TableColumn> enumeration = header.getColumnModel().getColumns();
|
||||
while (enumeration.hasMoreElements()) {
|
||||
cellRect.height = size.height;
|
||||
cellRect.y = 0;
|
||||
TableColumn aColumn = enumeration.nextElement();
|
||||
Enumeration<ColumnGroup> cGroups = ((GroupableTableHeader) header)
|
||||
.getColumnGroups(aColumn);
|
||||
Enumeration<ColumnGroup> cGroups = ((GroupableTableHeader) header).getColumnGroups(aColumn);
|
||||
if (cGroups != null) {
|
||||
int groupHeight = 0;
|
||||
while (cGroups.hasMoreElements()) {
|
||||
ColumnGroup cGroup = cGroups.nextElement();
|
||||
ColumnGroup cGroup = cGroups.nextElement();
|
||||
Rectangle groupRect = (Rectangle) h.get(cGroup);
|
||||
if (groupRect == null) {
|
||||
groupRect = new Rectangle(cellRect);
|
||||
Dimension d = cGroup.getSize(header.getTable());
|
||||
if (!System.getProperty("java.vm.version").startsWith(
|
||||
"1.2")) {
|
||||
if (!System.getProperty("java.vm.version").startsWith("1.2")) {
|
||||
int iColCount = getColCountUnderColGroup(cGroup, 0);
|
||||
groupRect.width = d.width - iColCount
|
||||
* columnMargin;
|
||||
groupRect.width = d.width - iColCount * columnMargin;
|
||||
} else {
|
||||
groupRect.width = d.width;
|
||||
}
|
||||
@@ -151,7 +146,7 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI {
|
||||
} else {
|
||||
cellRect.width = aColumn.getWidth() + columnMargin;
|
||||
}
|
||||
|
||||
|
||||
if (cellRect.intersects(clipBounds)) {
|
||||
paintCell(g, cellRect, column);
|
||||
}
|
||||
@@ -159,7 +154,7 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI {
|
||||
column++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void paintCell(Graphics g, Rectangle cellRect, int columnIndex) {
|
||||
TableColumn aColumn = header.getColumnModel().getColumn(columnIndex);
|
||||
TableCellRenderer renderer = aColumn.getHeaderRenderer();
|
||||
@@ -167,12 +162,11 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI {
|
||||
if (renderer == null) {
|
||||
renderer = new DefaultTableCellRenderer() {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table,
|
||||
Object value, boolean isSelected, boolean hasFocus,
|
||||
int row, int column) {
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
|
||||
boolean hasFocus, int row, int column) {
|
||||
JTableHeader header = table.getTableHeader();
|
||||
if (header != null) {
|
||||
setForeground(header.getForeground());
|
||||
@@ -186,27 +180,26 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
String headerValue = aColumn.getHeaderValue().toString();
|
||||
Component component = renderer.getTableCellRendererComponent(header
|
||||
.getTable(), headerValue, false, false, -1, columnIndex);
|
||||
|
||||
Component component = renderer.getTableCellRendererComponent(header.getTable(), headerValue, false, false, -1,
|
||||
columnIndex);
|
||||
|
||||
rendererPane.add(component);
|
||||
rendererPane.paintComponent(g, component, header, cellRect.x,
|
||||
cellRect.y, cellRect.width, cellRect.height, true);
|
||||
rendererPane.paintComponent(g, component, header, cellRect.x, cellRect.y, cellRect.width, cellRect.height, true);
|
||||
}
|
||||
|
||||
|
||||
private void paintCell(Graphics g, Rectangle cellRect, ColumnGroup cGroup) {
|
||||
TableCellRenderer renderer = cGroup.getHeaderRenderer();
|
||||
//
|
||||
if (renderer == null) {
|
||||
renderer = new DefaultTableCellRenderer() {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table,
|
||||
Object value, boolean isSelected, boolean hasFocus,
|
||||
int row, int column) {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
|
||||
boolean hasFocus, int row, int column) {
|
||||
JTableHeader header = table.getTableHeader();
|
||||
if (header != null) {
|
||||
setForeground(header.getForeground());
|
||||
@@ -220,17 +213,16 @@ public class GroupableTableHeaderUI extends BasicTableHeaderUI {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
String headerValue = cGroup.getHeaderValue().toString();
|
||||
Component component = renderer.getTableCellRendererComponent(header
|
||||
.getTable(), headerValue, false, false, -1, -1);
|
||||
|
||||
Component component = renderer.getTableCellRendererComponent(header.getTable(), headerValue, false, false, -1,
|
||||
-1);
|
||||
|
||||
rendererPane.add(component);
|
||||
rendererPane.paintComponent(g, component, header, cellRect.x,
|
||||
cellRect.y, cellRect.width, cellRect.height, true);
|
||||
rendererPane.paintComponent(g, component, header, cellRect.x, cellRect.y, cellRect.width, cellRect.height, true);
|
||||
}
|
||||
|
||||
|
||||
public void setHeaderHeight(int iHeight) {
|
||||
m_height = iHeight;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,125 +33,123 @@ import javax.swing.table.TableCellRenderer;
|
||||
/**
|
||||
* 用于显示RowHeader的JTable,只需要将其加入JScrollPane的RowHeaderView即可为JTable生成行标题
|
||||
*/
|
||||
public class RowHeaderTable extends JTable
|
||||
{
|
||||
private static final long serialVersionUID = 1L;
|
||||
public class RowHeaderTable extends JTable {
|
||||
|
||||
/**
|
||||
* 为JTable添加RowHeader,
|
||||
* @param refTable 需要添加rowHeader的JTable
|
||||
* @param columnWideth rowHeader的宽度
|
||||
*/
|
||||
public RowHeaderTable(JTable refTable,int columnWidth){
|
||||
this(null,refTable,columnWidth,1);
|
||||
}
|
||||
|
||||
public RowHeaderTable(ArrayList<String> title,JTable refTable,int columnWidth) {
|
||||
this(title,refTable,columnWidth,1);
|
||||
}
|
||||
|
||||
public RowHeaderTable(ArrayList<String> title,JTable refTable,int columnWidth,int rowSpan) {
|
||||
super(new DefaultTableModel(refTable.getRowCount()/rowSpan,1));
|
||||
this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//不可以调整列宽
|
||||
this.getColumnModel().getColumn(0).setPreferredWidth(columnWidth);
|
||||
this.setDefaultRenderer(Object.class,new RowHeaderRenderer(title,refTable,this,rowSpan));//设置渲染器
|
||||
this.setPreferredScrollableViewportSize (new Dimension(columnWidth,0));
|
||||
}
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 为JTable添加RowHeader,
|
||||
*
|
||||
* @param refTable 需要添加rowHeader的JTable
|
||||
* @param columnWideth rowHeader的宽度
|
||||
*/
|
||||
public RowHeaderTable(JTable refTable, int columnWidth){
|
||||
this(null, refTable, columnWidth, 1);
|
||||
}
|
||||
|
||||
public RowHeaderTable(ArrayList<String> title, JTable refTable, int columnWidth){
|
||||
this(title, refTable, columnWidth, 1);
|
||||
}
|
||||
|
||||
public RowHeaderTable(ArrayList<String> title, JTable refTable, int columnWidth, int rowSpan){
|
||||
super(new DefaultTableModel(refTable.getRowCount() / rowSpan, 1));
|
||||
this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);// 不可以调整列宽
|
||||
this.getColumnModel().getColumn(0).setPreferredWidth(columnWidth);
|
||||
this.setDefaultRenderer(Object.class, new RowHeaderRenderer(title, refTable, this, rowSpan));// 设置渲染器
|
||||
this.setPreferredScrollableViewportSize(new Dimension(columnWidth, 0));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 用于显示RowHeader的JTable的渲染器,当选择某行时,该行颜色会发生变化
|
||||
*/
|
||||
final class RowHeaderRenderer extends JLabel implements TableCellRenderer,ListSelectionListener
|
||||
{
|
||||
private static final long serialVersionUID = 1L;
|
||||
private JTable reftable;//需要添加rowHeader的JTable
|
||||
private JTable tableShow;//用于显示rowHeader的JTable
|
||||
private ArrayList<String> headerList;
|
||||
private int rowHeightNow;
|
||||
private int rowSpan;
|
||||
|
||||
public RowHeaderRenderer(JTable reftable,JTable tableShow) {
|
||||
this(null,reftable,tableShow,0);
|
||||
}
|
||||
|
||||
public RowHeaderRenderer(ArrayList<String> headerList,
|
||||
JTable reftable,JTable tableShow,int rowSpan)
|
||||
{
|
||||
this.headerList = headerList;
|
||||
this.reftable = reftable;
|
||||
this.tableShow=tableShow;
|
||||
//增加监听器,实现当在reftable中选择行时,RowHeader会发生颜色变化
|
||||
ListSelectionModel listModel=reftable.getSelectionModel();
|
||||
listModel.addListSelectionListener(this);
|
||||
rowHeightNow = reftable.getRowCount()*reftable.getRowHeight();
|
||||
this.rowSpan = rowSpan;
|
||||
if (rowSpan > 1) {
|
||||
rowHeightNow = rowSpan*reftable.getRowHeight();
|
||||
}
|
||||
final class RowHeaderRenderer extends JLabel implements TableCellRenderer, ListSelectionListener {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private JTable reftable; // 需要添加rowHeader的JTable
|
||||
private JTable tableShow; // 用于显示rowHeader的JTable
|
||||
private ArrayList<String> headerList;
|
||||
private int rowHeightNow;
|
||||
private int rowSpan;
|
||||
|
||||
public RowHeaderRenderer(JTable reftable, JTable tableShow){
|
||||
this(null, reftable, tableShow, 0);
|
||||
}
|
||||
public Component getTableCellRendererComponent(JTable table,Object obj,
|
||||
boolean isSelected,boolean hasFocus,int row, int col)
|
||||
{
|
||||
int rowCountNow = reftable.getRowCount()/rowSpan;
|
||||
((DefaultTableModel)table.getModel()).setRowCount(rowCountNow);
|
||||
|
||||
public RowHeaderRenderer(ArrayList<String> headerList, JTable reftable, JTable tableShow, int rowSpan){
|
||||
this.headerList = headerList;
|
||||
this.reftable = reftable;
|
||||
this.tableShow = tableShow;
|
||||
// 增加监听器,实现当在reftable中选择行时,RowHeader会发生颜色变化
|
||||
ListSelectionModel listModel = reftable.getSelectionModel();
|
||||
listModel.addListSelectionListener(this);
|
||||
rowHeightNow = reftable.getRowCount() * reftable.getRowHeight();
|
||||
this.rowSpan = rowSpan;
|
||||
if (rowSpan > 1) {
|
||||
rowHeightNow = rowSpan * reftable.getRowHeight();
|
||||
}
|
||||
}
|
||||
|
||||
public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected, boolean hasFocus,
|
||||
int row, int col) {
|
||||
int rowCountNow = reftable.getRowCount() / rowSpan;
|
||||
((DefaultTableModel) table.getModel()).setRowCount(rowCountNow);
|
||||
JTableHeader header = reftable.getTableHeader();
|
||||
this.setOpaque(true);
|
||||
setBorder(UIManager.getBorder("TableHeader.cellBorder"));//设置为TableHeader的边框类型
|
||||
setHorizontalAlignment(CENTER);//让text居中显示
|
||||
setBackground(header.getBackground());//设置背景色为TableHeader的背景色
|
||||
if ( isSelect(row) ) //当选取单元格时,在row header上设置成选取颜色
|
||||
setBorder(UIManager.getBorder("TableHeader.cellBorder"));// 设置为TableHeader的边框类型
|
||||
setHorizontalAlignment(CENTER);// 让text居中显示
|
||||
setBackground(header.getBackground());// 设置背景色为TableHeader的背景色
|
||||
if (isSelect(row)) // 当选取单元格时,在row header上设置成选取颜色
|
||||
{
|
||||
setForeground(Color.white);
|
||||
setBackground(Color.lightGray);
|
||||
} else {
|
||||
setForeground(header.getForeground());
|
||||
}
|
||||
else
|
||||
{
|
||||
setForeground(header.getForeground());
|
||||
setFont(header.getFont());
|
||||
if (row <= rowCountNow) {
|
||||
showCol(row);
|
||||
}
|
||||
setFont(header.getFont());
|
||||
if (row <= rowCountNow){
|
||||
showCol(row);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
private void showCol(int row) {
|
||||
|
||||
String text = null;
|
||||
if (headerList != null && row < headerList.size()) {
|
||||
text = headerList.get(row);
|
||||
} else {
|
||||
text = String.valueOf(row+1);
|
||||
}
|
||||
if (rowSpan > 1) {
|
||||
setText(text);
|
||||
this.tableShow.setRowHeight(row, rowHeightNow);
|
||||
} else {
|
||||
setText(text);
|
||||
}
|
||||
|
||||
|
||||
String text = null;
|
||||
if (headerList != null && row < headerList.size()) {
|
||||
text = headerList.get(row);
|
||||
} else {
|
||||
text = String.valueOf(row + 1);
|
||||
}
|
||||
if (rowSpan > 1) {
|
||||
setText(text);
|
||||
this.tableShow.setRowHeight(row, rowHeightNow);
|
||||
} else {
|
||||
setText(text);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void valueChanged(ListSelectionEvent e){
|
||||
this.tableShow.repaint();
|
||||
}
|
||||
private boolean isSelect(int row)
|
||||
{
|
||||
|
||||
public void valueChanged(ListSelectionEvent e) {
|
||||
this.tableShow.repaint();
|
||||
}
|
||||
|
||||
private boolean isSelect(int row) {
|
||||
int[] sel = reftable.getSelectedRows();
|
||||
if (rowSpan <= 1) {
|
||||
for ( int i=0,len = sel.length; i<len; i++ ) {
|
||||
if (sel[i] == row ) {
|
||||
return true;
|
||||
for (int i = 0, len = sel.length; i < len; i++) {
|
||||
if (sel[i] == row) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for ( int i=0,len = sel.length; i<len; i++ ) {
|
||||
if (sel[i] / rowSpan == row) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (int i = 0, len = sel.length; i < len; i++) {
|
||||
if (sel[i] / rowSpan == row) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,214 +20,206 @@ import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* The Class TableDataProcessor.
|
||||
* 表格数据处理类
|
||||
*
|
||||
* @author yunnysunny<yunnysunny@gmail.com>
|
||||
*/
|
||||
public final class TableDataProcessor {
|
||||
|
||||
/** The Constant COLUMN_KEY_NAME. */
|
||||
private static final String COLUMN_KEY_NAME = "名称";
|
||||
|
||||
/** The Constant COLUMN_VALUE_NAME. */
|
||||
private static final String COLUMN_VALUE_NAME = "值";
|
||||
|
||||
/**
|
||||
* Instantiates a new table data processor.
|
||||
*/
|
||||
private TableDataProcessor() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 将行数据转化为列数据
|
||||
* 由于json中的数据是按照一条条的记录返回的,而在显示的时候需要按照“名称”、“值”两列显示,所以要做转化。
|
||||
*
|
||||
* @param rowDatas 原始数据
|
||||
* @param keyword 关键字,可以为null
|
||||
* @return 生成的列数据的对象
|
||||
*/
|
||||
public static ColumnData row2col(
|
||||
ArrayList<LinkedHashMap<String, Object>> rowDatas, String keyword) {
|
||||
ColumnData datas = new ColumnData();
|
||||
ArrayList<LinkedHashMap<String, Object>> coldatas
|
||||
= new ArrayList<LinkedHashMap<String, Object>>();
|
||||
ArrayList<String> colNames = new ArrayList<String>();
|
||||
int rowCount = 0;
|
||||
int colCount = 0;
|
||||
for(LinkedHashMap<String, Object> row: rowDatas) {
|
||||
if (keyword != null) {
|
||||
String keyNow = row.remove(keyword).toString();
|
||||
colNames.add(keyNow);
|
||||
}
|
||||
rowCount ++;
|
||||
|
||||
for(Map.Entry <String, Object> element : row.entrySet()) {
|
||||
LinkedHashMap<String, Object> colData
|
||||
= new LinkedHashMap<String, Object>();
|
||||
colData.put(COLUMN_KEY_NAME, element.getKey());
|
||||
colData.put(COLUMN_VALUE_NAME, element.getValue());
|
||||
coldatas.add(colData);
|
||||
if (rowCount == 1) {
|
||||
colCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
datas.setCount(colCount);
|
||||
datas.setDatas(coldatas);
|
||||
datas.setNames(colNames);
|
||||
return datas;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将行数据转化为多个表格中的列数据
|
||||
* 和{@link #row2col(ArrayList<LinkedHashMap<String,Object>>, String)}类似,
|
||||
* 只不过这里是返回多个表格数据
|
||||
*
|
||||
* @param rowDatas 原始数据
|
||||
* @param keyword the keyword
|
||||
* @return 生成的列数据的对象
|
||||
*/
|
||||
public static ColumnData mutilRow2col(
|
||||
ArrayList<LinkedHashMap<String, Object>> rowDatas, String keyword) {
|
||||
ColumnData datas = new ColumnData();
|
||||
ArrayList<ArrayList<LinkedHashMap<String, Object>>> tableDatas
|
||||
= new ArrayList<ArrayList<LinkedHashMap<String, Object>>>();
|
||||
|
||||
ArrayList<String> colNames = new ArrayList<String>();
|
||||
int rowCount = 0;
|
||||
|
||||
for(LinkedHashMap<String, Object> row: rowDatas) {
|
||||
if (keyword != null) {
|
||||
String keyNow = row.remove(keyword).toString();
|
||||
colNames.add(keyNow);
|
||||
}
|
||||
rowCount ++;
|
||||
|
||||
ArrayList<LinkedHashMap<String, Object>> coldatas
|
||||
= new ArrayList<LinkedHashMap<String, Object>>();
|
||||
for(Map.Entry <String, Object> element : row.entrySet()) {
|
||||
LinkedHashMap<String, Object> colData
|
||||
= new LinkedHashMap<String, Object>();
|
||||
colData.put(COLUMN_KEY_NAME, element.getKey());
|
||||
colData.put(COLUMN_VALUE_NAME, element.getValue());
|
||||
coldatas.add(colData);
|
||||
|
||||
}
|
||||
tableDatas.add(coldatas);
|
||||
}
|
||||
datas.setCount(rowCount);
|
||||
datas.setTableDatas(tableDatas);
|
||||
datas.setNames(colNames);
|
||||
return datas;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将行数据转化为列数据,这里只是调用了{@link #row2col(ArrayList<LinkedHashMap<String,Object>>, String)},
|
||||
* 将第二个参数置为null。
|
||||
*
|
||||
* @param rowDatas 原始数据
|
||||
* @return 生成的列数据的对象
|
||||
*/
|
||||
public static ColumnData row2col(
|
||||
ArrayList<LinkedHashMap<String, Object>> rowDatas) {
|
||||
return row2col(rowDatas,null);
|
||||
}
|
||||
|
||||
/**
|
||||
* The Class ColumnData.
|
||||
*/
|
||||
public static class ColumnData {
|
||||
|
||||
/** 关键字集合. */
|
||||
private ArrayList<String> names;
|
||||
|
||||
/** 单个表格数据. */
|
||||
private ArrayList<LinkedHashMap<String, Object>> datas;
|
||||
|
||||
/** 多个表格数据. */
|
||||
private ArrayList<ArrayList<LinkedHashMap<String, Object>>> tableDatas;
|
||||
|
||||
/** 返回的数据总数,如果返回单个表格,则为表格行数;如果返回多个表格数据,则为表格个数. */
|
||||
private int count;
|
||||
|
||||
/**
|
||||
* Instantiates a new column data.
|
||||
*/
|
||||
public ColumnData() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取关键字集合
|
||||
*
|
||||
* @return the names
|
||||
*/
|
||||
public ArrayList<String> getNames() {
|
||||
return names;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置关键字集合
|
||||
*
|
||||
* @param names the new names
|
||||
*/
|
||||
public void setNames(ArrayList<String> names) {
|
||||
this.names = names;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单个表格数据
|
||||
*
|
||||
* @return the datas
|
||||
*/
|
||||
public ArrayList<LinkedHashMap<String, Object>> getDatas() {
|
||||
return datas;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置单个表格数据
|
||||
*
|
||||
* @param datas the datas
|
||||
*/
|
||||
public void setDatas(ArrayList<LinkedHashMap<String, Object>> datas) {
|
||||
this.datas = datas;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回的数据总数,如果返回单个表格,则为表格行数;如果返回多个表格数据,则为表格个数
|
||||
*
|
||||
* @return the count
|
||||
*/
|
||||
public int getCount() {
|
||||
return count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the count.
|
||||
*
|
||||
* @param count the new count
|
||||
*/
|
||||
public void setCount(int count) {
|
||||
this.count = count;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回多个表格数据
|
||||
*
|
||||
* @return the table datas
|
||||
*/
|
||||
public ArrayList<ArrayList<LinkedHashMap<String, Object>>> getTableDatas() {
|
||||
return tableDatas;
|
||||
}
|
||||
/** 名称列的列名. */
|
||||
private static final String COLUMN_KEY_NAME = "名称";
|
||||
|
||||
/**
|
||||
* 设置多个表格数据
|
||||
*
|
||||
* @param tableDatas the table datas
|
||||
*/
|
||||
public void setTableDatas(
|
||||
ArrayList<ArrayList<LinkedHashMap<String, Object>>> tableDatas) {
|
||||
this.tableDatas = tableDatas;
|
||||
}
|
||||
|
||||
}
|
||||
/** 内容列的列名. */
|
||||
private static final String COLUMN_VALUE_NAME = "值";
|
||||
|
||||
/**
|
||||
* TableDataProcessor的构造函数
|
||||
*/
|
||||
private TableDataProcessor(){
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 将行数据转化为列数据 由于json中的数据是按照一条条的记录返回的,
|
||||
* 而在显示的时候需要按照“名称”、“值”两列显示,所以要做转化。
|
||||
*
|
||||
* @param rowDatas 原始数据
|
||||
* @param keyword 关键字,可以为null
|
||||
* @return 生成的列数据的对象
|
||||
*/
|
||||
public static ColumnData row2col(ArrayList<LinkedHashMap<String, Object>> rowDatas, String keyword) {
|
||||
ColumnData datas = new ColumnData();
|
||||
ArrayList<LinkedHashMap<String, Object>> coldatas = new ArrayList<LinkedHashMap<String, Object>>();
|
||||
ArrayList<String> colNames = new ArrayList<String>();
|
||||
int rowCount = 0;
|
||||
int colCount = 0;
|
||||
for (LinkedHashMap<String, Object> row : rowDatas) {
|
||||
if (keyword != null) {
|
||||
String keyNow = row.remove(keyword).toString();
|
||||
colNames.add(keyNow);
|
||||
}
|
||||
rowCount++;
|
||||
|
||||
for (Map.Entry<String, Object> element : row.entrySet()) {
|
||||
LinkedHashMap<String, Object> colData = new LinkedHashMap<String, Object>();
|
||||
colData.put(COLUMN_KEY_NAME, element.getKey());
|
||||
colData.put(COLUMN_VALUE_NAME, element.getValue());
|
||||
coldatas.add(colData);
|
||||
if (rowCount == 1) {
|
||||
colCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
datas.setCount(colCount);
|
||||
datas.setDatas(coldatas);
|
||||
datas.setNames(colNames);
|
||||
return datas;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将行数据转化为多个表格中的列数据 和{@link #row2col(ArrayList<LinkedHashMap<String,Object>>, String)}类似,
|
||||
* 只不过这里是返回多个表格数据
|
||||
*
|
||||
* @param rowDatas 原始数据
|
||||
* @param keyword the keyword
|
||||
* @return 生成的列数据的对象
|
||||
*/
|
||||
public static ColumnData mutilRow2col(ArrayList<LinkedHashMap<String, Object>> rowDatas, String keyword) {
|
||||
ColumnData datas = new ColumnData();
|
||||
ArrayList<ArrayList<LinkedHashMap<String, Object>>> tableDatas = new ArrayList<ArrayList<LinkedHashMap<String, Object>>>();
|
||||
|
||||
ArrayList<String> colNames = new ArrayList<String>();
|
||||
int rowCount = 0;
|
||||
|
||||
for (LinkedHashMap<String, Object> row : rowDatas) {
|
||||
if (keyword != null) {
|
||||
String keyNow = row.remove(keyword).toString();
|
||||
colNames.add(keyNow);
|
||||
}
|
||||
rowCount++;
|
||||
|
||||
ArrayList<LinkedHashMap<String, Object>> coldatas = new ArrayList<LinkedHashMap<String, Object>>();
|
||||
for (Map.Entry<String, Object> element : row.entrySet()) {
|
||||
LinkedHashMap<String, Object> colData = new LinkedHashMap<String, Object>();
|
||||
colData.put(COLUMN_KEY_NAME, element.getKey());
|
||||
colData.put(COLUMN_VALUE_NAME, element.getValue());
|
||||
coldatas.add(colData);
|
||||
|
||||
}
|
||||
tableDatas.add(coldatas);
|
||||
}
|
||||
datas.setCount(rowCount);
|
||||
datas.setTableDatas(tableDatas);
|
||||
datas.setNames(colNames);
|
||||
return datas;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将行数据转化为列数据,这里只是调用了{@link #row2col(ArrayList<LinkedHashMap<String,Object>>, String)},
|
||||
* 将第二个参数置为null。
|
||||
*
|
||||
* @param rowDatas 原始数据
|
||||
* @return 生成的列数据的对象
|
||||
*/
|
||||
public static ColumnData row2col(ArrayList<LinkedHashMap<String, Object>> rowDatas) {
|
||||
return row2col(rowDatas, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* The Class ColumnData.
|
||||
*/
|
||||
public static class ColumnData {
|
||||
|
||||
/** 关键字集合. */
|
||||
private ArrayList<String> names;
|
||||
|
||||
/** 单个表格数据. */
|
||||
private ArrayList<LinkedHashMap<String, Object>> datas;
|
||||
|
||||
/** 多个表格数据. */
|
||||
private ArrayList<ArrayList<LinkedHashMap<String, Object>>> tableDatas;
|
||||
|
||||
/** 返回的数据总数,如果返回单个表格,则为表格行数;如果返回多个表格数据,则为表格个数. */
|
||||
private int count;
|
||||
|
||||
/**
|
||||
* ColumnData构造函数
|
||||
*/
|
||||
public ColumnData(){
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取关键字集合
|
||||
*
|
||||
* @return the names
|
||||
*/
|
||||
public ArrayList<String> getNames() {
|
||||
return names;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置关键字集合
|
||||
*
|
||||
* @param names the new names
|
||||
*/
|
||||
public void setNames(ArrayList<String> names) {
|
||||
this.names = names;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单个表格数据
|
||||
*
|
||||
* @return the datas
|
||||
*/
|
||||
public ArrayList<LinkedHashMap<String, Object>> getDatas() {
|
||||
return datas;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置单个表格数据
|
||||
*
|
||||
* @param datas the datas
|
||||
*/
|
||||
public void setDatas(ArrayList<LinkedHashMap<String, Object>> datas) {
|
||||
this.datas = datas;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回的数据总数,如果返回单个表格,则为表格行数;如果返回多个表格数据,则为表格个数
|
||||
*
|
||||
* @return the count
|
||||
*/
|
||||
public int getCount() {
|
||||
return count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the count.
|
||||
*
|
||||
* @param count the new count
|
||||
*/
|
||||
public void setCount(int count) {
|
||||
this.count = count;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回多个表格数据
|
||||
*
|
||||
* @return the table datas
|
||||
*/
|
||||
public ArrayList<ArrayList<LinkedHashMap<String, Object>>> getTableDatas() {
|
||||
return tableDatas;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置多个表格数据
|
||||
*
|
||||
* @param tableDatas the table datas
|
||||
*/
|
||||
public void setTableDatas(ArrayList<ArrayList<LinkedHashMap<String, Object>>> tableDatas) {
|
||||
this.tableDatas = tableDatas;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user