I want to display some of the columns from a Table object (it is loaded from a csv file) and then retrieve the row of information when the user clicks on the row. I do not see a “native” mechanism to do this in processing…
1 Like
// shows a table
// on mouse over: status bar text
// on mouse click: Info box
// class with tools
ToolsForTable toolsForTable = new ToolsForTable();
// the table
Table tableResources;
//----------------------------------------------------------------------------------------------------------------
void setup() {
size(1600, 660);
background(toolsForTable.WHITE);
// setting up table ---
setupTable();
}
void draw() {
background(0);
toolsForTable.showTable(tableResources,
20, 52);
fill(toolsForTable.WHITE);
text("The Settlers of Catan - Building Costs",
20, 27);
text("Place the mouse over a word to show full text in the Status Bar. Click to show Info Box. ",
20, height/2-110);
}
//----------------------------------------------------------------------------------------------------------------
void setupTable() {
// Make entire table
// setting up table (column names / headlines) ---
tableResources = toolsForTable.newTable("Item", "brick", "wood", "sheep", "wheat", "ore", "points");
// adding data (number of data must match number of headlines)
println("Adding Road row");
tableResources = toolsForTable.tableAddDataAsNewRow ( tableResources, "Road (establishing the longest road: 2 victory points)", "1x", "1x", "", "", "", "0" );
if (tableResources==null)
return;
println("Adding Settlement row");
tableResources = toolsForTable.tableAddDataAsNewRow ( tableResources, "Settlement. Players with a settlement adjacent to a hex containing the number just rolled with the dice receive one card of the corresponding resource.", "1x", "1x", "1x", "1x", "", "1" );
if (tableResources==null)
return;
println("Adding City row");
tableResources = toolsForTable.tableAddDataAsNewRow ( tableResources, "City (which must replace existing settlement). Cities produce two cards of the corresponding resource.", "", "", "", "2x", "3x", "2");
if (tableResources==null)
return;
println("Adding 'Development Card' row");
String textDevelopmentCard =
"Development Card - Three types of development cards include cards worth one victory point; "
+"knight cards, which allow the player to move the robber as if they had rolled a 7 (but without the remove-half rule); "
+"and a third set of cards which allow the player one of three abilities when played.";
tableResources = toolsForTable.tableAddDataAsNewRow ( tableResources, textDevelopmentCard,
"", "", "1x", "1x", "1x", "?" );
if (tableResources==null)
return;
//
}
// ------------------------------------------------------------------------------
void mousePressed() {
// use class:
toolsForTable.mousePressedInClass(tableResources);
}//func
void keyPressed() {
key=0; // kill ESC
// use class:
toolsForTable.flagShowInfoBox=false;
}
//===============================================================================
// Tools collection
class ToolsForTable {
// class not like a car class Car for an object but a collection of tools.
final color RED = color(255, 0, 0);
final color GREEN = color(0, 255, 0);
final color BLUE = color(0, 0, 255);
final color WHITE = color(255);
final color BLACK = color(0);
final color GRAY = color(255/2);
final color YELLOW = color(255, 255, 13);
int factorX=122; // column width
boolean cursorSignShowFlag=false;
// show Info box?
boolean flagShowInfoBox=false;
int flagShowInfoBox_Row=0;
// ----------------------------------------------------------------
void showTable(Table tableBtn,
int x, int y) {
// int factorX=122; // column width
// rect
stroke(WHITE);
noFill();
rect( x, y,
tableBtn.getColumnCount()*factorX-6, (tableBtn.getRowCount()+1) * 22 + 10 );
// headline
showTableHeadline(tableBtn, x+6, y+19, factorX);
// horizontal line
stroke(WHITE);
line( x+2, y+5+19,
6+x+(tableBtn.getColumnCount())*factorX-13, y+5+19);
// grid
// loop over rows (y)
for (int i=0; i<tableBtn.getRowCount(); i++) {
// current data row
TableRow row = tableBtn.getRow(i);
// loop over columns in that row (i2 is for x)
for (int i2=0; i2<tableBtn.getColumnCount(); i2++) {
fill(WHITE);
text(row.getString(i2),
i2*factorX+x+6, 25+ i * 22 +y+8,
factorX-8, 15);
if (mouseInside(i2*factorX+x+6, 25+ i * 22 +y+8,
factorX-8, 15)) {
statusBar(row.getString(i2));
}//if
// vertical line
stroke(WHITE);
line( i2*factorX+x, +y,
i2*factorX+x, tableBtn.getRowCount() * 22 + y + 31);
}//for
}//for
showInfoBox(tableBtn);
}// method
void showInfoBox(Table tableBtn) {
// abort?
if (!flagShowInfoBox)
return;
// current data row
TableRow row = tableBtn.getRow(flagShowInfoBox_Row);
String builtText="";
// loop over columns in that row (i2 is for x)
for (int i2=0; i2<tableBtn.getColumnCount(); i2++) {
builtText+=row.getString(i2) + "\n";
}//for
// Yellow box
fill(YELLOW);
rect(width-212, 25 +33+8-6,
190, 400);
// box frame
noFill();
stroke(BLACK);
final int innerDist=4;
rect(width-212+innerDist, 25 +33+8-6+innerDist,
190-innerDist*2, 400-innerDist*2);
// Text
fill(BLACK);
text(builtText,
width-200, 25 +33+8,
180, 915);
}//method
void mousePressedInClass(Table tableBtn) {
//
int x=22;
int y=52;
flagShowInfoBox=false;
// loop over rows (y)
for (int i=0; i<tableBtn.getRowCount(); i++) {
// current data row
TableRow row = tableBtn.getRow(i);
//// loop over columns in that row (i2 is for x)
//for (int i2=0; i2<tableBtn.getColumnCount(); i2++) {
if (mouseInsideRow(0, 25+ i * 22 +y+8,
factorX-8, 15)) {
// statusBar(row.getString(i2));
flagShowInfoBox=true;
flagShowInfoBox_Row = i;
return;
}//if
// }
}
}
// ---
boolean mouseInsideRow( float x_, float y_,
float w_, float h_) {
return
mouseY>y_ &&
mouseY<y_+h_;
}//func
boolean mouseInside( float x_, float y_,
float w_, float h_) {
return mouseX>x_ &&
mouseX<x_+w_ &&
mouseY>y_ &&
mouseY<y_+h_;
}//func
// ---
void statusBar(String textStatus) {
if (textStatus.equals(""))
return;
fill(GRAY);
noStroke();
rect(0, height-32,
width, 33);
fill(WHITE);
text (textStatus,
3, height-12);
}//func
void showTableHeadline(Table tableBtn,
int x, int y,
int factorX) {
// headline for table
TableRow row0 = tableBtn.getRow(0);
for (int i=0; i<tableBtn.getColumnCount(); i++) {
// headline
fill(GREEN);
text(row0.getColumnTitle(i),
i*factorX+x, y-2);
}
}//method
// ---
// make table
Table newTable (String... listColumnNames) {
Table newT = new Table();
// make columns
for (String s1 : listColumnNames) {
newT.addColumn(s1);
}
return newT;
}//method
Table tableAddDataAsNewRow(Table table1, String... data1) {
//
//println(data1.length);
//println(table1.getColumnCount());
if (data1.length != table1.getColumnCount()) {
//
println("Big Error: "+"tableAddData says: the number of values doesn't match the number of columns (values were: "
+stringFromArray(data1)+").");
exit();
return null;
}
// add rows with data
TableRow newRow = table1.addRow();
// add rows with data
int i=0;
for (String s1 : data1) {
newRow.setString(newRow.getColumnTitle(i), s1);
i++;
}
// return result
return table1;
}//method
// ---
String stringFromArray(String... data1) {
String result=" | ";
for (String s1 : data1) {
result += s1+" | ";
}//for
return result;
}//method
void printlnTable(Table tableBtn) {
// rect
stroke(WHITE);
noFill();
println("------------------------------------");
// headline
printlnTableHeadline(tableBtn);
// grid
// loop over rows (y)
for (int i=0; i<tableBtn.getRowCount(); i++) {
// current data row
TableRow row = tableBtn.getRow(i);
// loop over columns in that row (i2 is for x)
String s1="";
for (int i2=0; i2<tableBtn.getColumnCount(); i2++) {
s1+=" "+row.getString(i2);
//
}//for
println(s1);
}//for
println("===========================================");
//
} // method
void printlnTableHeadline(Table tableBtn ) {
// headline for table
TableRow row0 = tableBtn.getRow(0);
for (int i=0; i<tableBtn.getColumnCount(); i++) {
// headline
print(" "+row0.getColumnTitle(i));
}
println("");
}//method
// ------------------------------------------------------------------
String cursorSign() {
// blinking cursor sign | for Input Box
if (frameCount % 13 == 0)
cursorSignShowFlag= ! cursorSignShowFlag;
if (cursorSignShowFlag)
return"|";
else return"";
}//method
//
}//class
//
2 Likes
Hi @TEACHMYSTERY @Chrisir
Have you also considered other options than processing ? While it can be done with Processing there are certainly better options for that kind of application. Depending on your objectives you’re are going to face other challenges down the road.
This is for a beginning student project where they are making a song player. I wanted to build in some data concepts at the end. It does not need to be robust, but I’d like them to build a Song class and apply a linear search algorithm…
1 Like
This looks perfect - I will post again later in the school year once I have implemented. Thank you!!
1 Like