The basic problem is that there is no fixed definition for tab, which more or less means move to the next tab position for the particular output device. It's mostly a historical feature that had a real hardware meaning (little metal "tabs" were inserted to stop the carriage).
In MS Word you can also move the tabs wherever you want. I use tab setting of 4 in the editor I use most frequently, but it used to be set a 3. Anyway, they surely didn't want to get into the mess of picking a given amount.
And it's also impossible to align things using spaces with JOptionPane's variable pitch font.
One solution is to use HTML, a subset of which is allowed in JOptionPane. For example, to solve your problem.
JOptionPane.showMessageDialog(null, "<html><table><tr><td>Name</td><td>Pieces</td><td>Pay</td></tr>" + "<tr><td>" + name + "</td><td>" + pieces + "</td><td>" + pay + "</td></tr>" + "</table></html>");
Of course, this requires knowing HTML, a good idea anyway. :-)
String.format(...)Another solution is to use the String.format(...) method that's in recent versions of Java.