- answered 546 questions
- asked 46 questions
- participated across 609 tags (mainly java, unix, bash and xml)
- received 35 badges - 2 gold, 10 silver and 23 bronze
Saturday, January 22, 2011
stackoverflow - 10k rep
I've finally crossed the 10k reputation milestone on stackoverflow! I thought I'd take this opportunity to reflect back on my time as a member of this famous programming Q & A site.
Even though I was one of the first people to join stackoverflow when the beta version came out two years ago, I did not become an active participant until much more recently. I have found this site to be a great way of helping people with programming difficulties and also as a great learning resource. During my time here, I have:
Labels:
stackoverflow
Saturday, January 08, 2011
A Paginated JList
If you have a large
JList and don't want to scroll through it, it might be a better idea to "paginate" it i.e. display the list in "pages" of a few rows at a time and allow users to flip back and forth between them. To do this, I have written a Java Swing component called PaginatedList, which looks like this:
You pass in a JList and specify a page size (the page size is 10 in this example) and it returns a PaginatedList which you can add onto another JComponent as normal. The code is shown below:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListModel;
/**
* A paginated JList. Only displays a specific number of rows
* and allows you to page back and forth through the list.
* with the help of a toolbar.
*/
public class PaginatedList extends JPanel {
private final int pageSize;
private final JList list;
private final ListModel model;
private final int lastPageNum;
private int currPageNum;
private JLabel countLabel ;
private JButton first, prev, next, last;
/**
* @param list the source list
* @param pageSize the number of rows visible
*/
public PaginatedList(JList list, int pageSize) {
super();
this.pageSize = pageSize;
this.list = list;
this.model = list.getModel();
//work out how many pages there are
this.lastPageNum = model.getSize() / pageSize +
(model.getSize() % pageSize != 0 ? 1 : 0);
this.currPageNum = lastPageNum > 0 ? 1 : 0;
setLayout(new BorderLayout());
countLabel = new JLabel() ;
add(countLabel, BorderLayout.NORTH);
add(list, BorderLayout.CENTER);
add(createControls(), BorderLayout.SOUTH);
updatePage();
}
private JPanel createControls() {
first = new JButton(new AbstractAction("<<") {
public void actionPerformed(ActionEvent e) {
currPageNum = 1;
updatePage();
}
});
prev = new JButton(new AbstractAction("<") {
public void actionPerformed(ActionEvent e) {
if (--currPageNum <= 0)
currPageNum = 1;
updatePage();
}
});
next = new JButton(new AbstractAction(">") {
public void actionPerformed(ActionEvent e) {
if (++currPageNum > lastPageNum)
currPageNum = lastPageNum;
updatePage();
}
});
last = new JButton(new AbstractAction(">>") {
public void actionPerformed(ActionEvent e) {
currPageNum = lastPageNum;
updatePage();
}
});
JPanel bar = new JPanel(new GridLayout(1, 4));
bar.add(first);
bar.add(prev);
bar.add(next);
bar.add(last);
return bar;
}
private void updatePage() {
//replace the list's model with a new model containing
//only the entries in the current page.
if(model.getSize() != 0){
final DefaultListModel page = new DefaultListModel();
final int start = (currPageNum - 1) * pageSize;
int end = start + pageSize;
if (end >= model.getSize()) {
end = model.getSize();
}
for (int i = start; i < end; i++) {
page.addElement(model.getElementAt(i));
}
list.setModel(page);
}
//update the label
countLabel.setText("Page " + currPageNum + "/" + lastPageNum);
// update buttons
final boolean canGoBack = currPageNum > 1;
final boolean canGoFwd = currPageNum != lastPageNum;
first.setEnabled(canGoBack);
prev.setEnabled(canGoBack);
next.setEnabled(canGoFwd);
last.setEnabled(canGoFwd);
}
public static void main(String args[]) throws Exception {
// create 100 elements of dummy data.
String[] data = new String[101];
for (int i = 0; i < data.length; i++) {
data[i] = "Item "+ (i + 1);
}
// create a paginated list with page size 20
PaginatedList list = new PaginatedList(new JList(data), 10);
// add it to a frame
JFrame f = new JFrame("Paginated List Demo");
f.add(list);
f.setSize(100, 100);
f.pack();
f.setVisible(true);
}
}
Labels:
Java,
programming,
swing
Saturday, January 01, 2011
fahd.blog in 2010
Happy 2011!
I'd like to wish everyone a great start to an even greater new year! During 2010, I posted 47 new entries on fahd.blog, which is 23% more than in 2009. In addition to more posts, I am thrilled that I have more readers from all over the world too! Thanks for reading! Top 5 posts of 2010: I'm going to be writing a lot more this year, so stay tuned for more great techie tips, tricks and hacks! :)
I'd like to wish everyone a great start to an even greater new year! During 2010, I posted 47 new entries on fahd.blog, which is 23% more than in 2009. In addition to more posts, I am thrilled that I have more readers from all over the world too! Thanks for reading! Top 5 posts of 2010: I'm going to be writing a lot more this year, so stay tuned for more great techie tips, tricks and hacks! :)
Subscribe to:
Comments (Atom)
