It's a simple example to display data in JTable in a line-chart, by combining example of "
JTable" and "
JComponent". To make it simple, only the first row will be shown on chart.
|
Display JTable data in line chart |
package javamyframe;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
/**
* @web http://java-buddy.blogspot.com/
*/
public class JavaMyFrame extends JFrame {
Label labelInfo;
JTable jTable;
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
createAndShowGUI();
});
}
private static void createAndShowGUI() {
JavaMyFrame myFrame = new JavaMyFrame();
myFrame.setTitle("java-buddy.blogspot.com");
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.prepareUI();
myFrame.pack();
myFrame.setVisible(true);
}
private void prepareUI(){
JPanel vPanel = new JPanel();
vPanel.setLayout(new BoxLayout(vPanel, BoxLayout.Y_AXIS));
MyChart myChart = new MyChart();
myChart.setPreferredSize(new Dimension(450, 200));
jTable = new JTable(new MyTableModel());
jTable.getSelectionModel()
.addListSelectionListener(new MyRowColListener());
jTable.getColumnModel().getSelectionModel()
.addListSelectionListener(new MyRowColListener());
jTable.setFillsViewportHeight(true);
JScrollPane jScrollPane = new JScrollPane(jTable);
jScrollPane.setPreferredSize(new Dimension(450, 100));
vPanel.add(jScrollPane);
labelInfo = new Label();
vPanel.add(labelInfo);
Button buttonPrintAll = new Button("Print All");
buttonPrintAll.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
System.out.println();
for(int i=0; i<jTable.getRowCount(); i++){
for(int j=0; j<jTable.getColumnCount(); j++){
String val = String.valueOf(jTable.getValueAt(i, j));
System.out.print(val + "\t");
}
System.out.println();
}
//Create ListArray for the first row
//and update MyChart
ArrayList<Integer> l = new ArrayList<>();
for(int i=0; i<jTable.getColumnCount(); i++){
l.add((Integer)jTable.getValueAt(0, i));
}
myChart.updateList(l);
}
});
getContentPane().add(myChart, BorderLayout.PAGE_START);
getContentPane().add(vPanel, BorderLayout.CENTER);
getContentPane().add(buttonPrintAll, BorderLayout.PAGE_END);
}
private class MyChart extends JComponent {
ArrayList<Integer> chartList;
public void updateList(ArrayList<Integer> l){
System.out.println("updateList()");
chartList = l;
repaint();
}
@Override
public void paint(Graphics g) {
System.out.println("paint()");
if(chartList != null){
paintMe(g);
}
}
private void paintMe(Graphics g){
Graphics2D graphics2d = (Graphics2D)g;
graphics2d.setColor(Color.blue);
int width = getWidth();
int height = getHeight();
float hDiv = (float)width/(float)(chartList.size()-1);
float vDiv = (float)height/(float)(Collections.max(chartList));
for(int i=0; i<chartList.size()-1; i++){
int value1, value2;
if(chartList.get(i)==null){
value1 = 0;
}else{
value1 = chartList.get(i);
}
if(chartList.get(i+1)==null){
value2 = 0;
}else{
value2 = chartList.get(i+1);
}
graphics2d.drawLine(
(int)(i*hDiv),
height - ((int)(value1*vDiv)),
(int)((i+1)*hDiv),
height - ((int)(value2*vDiv)));
}
graphics2d.drawRect(0, 0, width, height);
}
}
private class MyRowColListener implements ListSelectionListener {
@Override
public void valueChanged(ListSelectionEvent e) {
System.out.println("valueChanged: " + e.toString());
if (!e.getValueIsAdjusting()) {
int row = jTable.getSelectedRow();
int col = jTable.getSelectedColumn();
if(row>= 0 && col>=0){
int selectedItem = (int)jTable.getValueAt(row, col);
labelInfo.setText("MyRowListener: "
+ row + " : " + col + " = " + selectedItem);
}
}
}
}
class MyTableModel extends AbstractTableModel {
private String[] DayOfWeek = {
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
private Object[][] tableData = {
{1, 2, 3, 4, 5, 6, 7},
{4, 3, 2, 1, 7, 6, 5},
{12, 20, 13, 14, 11, 24, 56},
{13, 29, 23, 24, 25, 21, 20},
{2, 4, 6, 8, 10, 12, 14},
{11, 21, 33, 4, 9, 5, 4}};
@Override
public int getColumnCount() {
return DayOfWeek.length;
}
@Override
public int getRowCount() {
return tableData.length;
}
@Override
public String getColumnName(int col) {
return DayOfWeek[col];
}
@Override
public Object getValueAt(int row, int col) {
return tableData[row][col];
}
@Override
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
@Override
public boolean isCellEditable(int row, int col) {
return true;
}
@Override
public void setValueAt(Object value, int row, int col) {
tableData[row][col] = value;
fireTableCellUpdated(row, col);
}
}
}