Welcome to the Java Programming Forums


The professional, friendly Java community. 21,500 members and growing!


The Java Programming Forums are a community of Java programmers from all around the World. Our members have a wide range of skills and they all have one thing in common: A passion to learn and code Java. We invite beginner Java programmers right through to Java professionals to post here and share your knowledge. Become a part of the community, help others, expand your knowledge of Java and enjoy talking with like minded people. Registration is quick and best of all free. We look forward to meeting you.


>> REGISTER NOW TO START POSTING


Members have full access to the forums. Advertisements are removed for registered users.

Results 1 to 23 of 23

Thread: Working with custom JList Component in Java

  1. #1
    Member
    Join Date
    Jun 2014
    Posts
    77
    Thanks
    14
    Thanked 0 Times in 0 Posts

    Default Working with custom JList Component in Java

    I am trying to use the JList to display a list of students. Now, each student has a first name, last name and course taken. each courses taken by the student has its' own name, level and idNumber. For now, I am just trying to create my own custom JList model for the students. I have the custom model as well as the button event calling it. Unfortunately, when I click the button to display the student info added, the component is NOT fired up!.. I am not sure what I have done wrong regarding creating the component because I can display the information on the console and the list contains everything I have added but just to display it on the component is NOT working. Any help will save me a boring week. I have broken the codes into sub classes, you can add the classes to the same package or create sub packages to insert individual classes.


    The student class

     
    public class Student {
     
    	private String studentName;
    	private String studentID ;
     
    	public String getStudentName(){
    	return studentName;
    	}
     
    	public String getStudentId(){
    		return studentID;
    		}
     
    	public void setStudentName(String name){
    	this.studentName = name;
    	}
     
    	public void setStudentId(String id){
    	this.studentID = id;
    	}
     
    	public Student(String studentName, String studentId){
    	this.studentName = studentName;
    	this.studentID = studentId;
    	}
     
    	public Student(){
     
    	}
     
    	@Override
    	public String toString() {
    		return "Student [studentName=" + studentName + ", studentID=" + studentID + "]";
    	}
     
    }


    The custom JList model class

     
    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.AbstractListModel;
     
     
    public class StudentList<E> extends AbstractListModel<E> {
     
     
    	List<Student> studentList = new ArrayList<Student>();
    	@Override
    	public int getSize() {
    		return studentList.size();
    	}
     
    	@Override
    	public E getElementAt(int index) {
     
    		return (E)studentList.get(index);
     
    	}
     
    	/**
    	 * adds a student to the JList panel
    	 * @param student to be added
    	 */
    	public void add(Student student) {
    	    System.out.println("adding");
    	    studentList.add(student);
    	    int index0 = studentList.size() - 1;
    	    int index1 = index0;
    	    fireIntervalAdded(this, index0, index1);
    	    System.out.println(studentList.toString());
    	}
     
     
     
    }


    The controller class

     
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JList;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.ListSelectionModel;
     
    public class Controller {
     
    	private static StudentList studentList; //the JList custom model
    	private ViewGui view; //the view
    	private Student student; //the model
     
    	public Controller(ViewGui view, Student student){
    	this.student = student;
    	this.view = view;
    	view.setVisible(true);
    	this.view.addStudentListener(new AddStudentListener());
    	}
     
    	class AddStudentListener implements ActionListener {
    	   public void actionPerformed(ActionEvent e) {
    			if (e.getActionCommand().equals("click me!")) {	
    				view.setVisible(false);
    				studentList = new StudentList(); // initialize the JList model
    				Student studenta = new Student();
    				studenta.setStudentName("Lance");
    				studenta.setStudentId("01");
    				studentList.add(studenta); // add the student
    				Student studentb = new Student();
    				studentb.setStudentName("John");
    				studentb.setStudentId("02");
    				studentList.add(studentb); // add the student
    				JFrame c = new JFrame();
    				c.getContentPane();
    				c.setSize(300, 300);
    			    c.setLayout(new BorderLayout());
    				JPanel panel = new JPanel();
    				JList<Student> list = new JList<Student>(studentList);
    				panel.add(list);
    				list.setVisibleRowCount(3);
    				list.setFont(new Font("Tahoma", Font.PLAIN, 14));
    				list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    				list.setBounds(0, 0, 100, 400);
    				c.add(panel,   BorderLayout.NORTH);
    				c.setVisible(true);
     
     
    			}
    	                     }
    					}
     
    				}



    The View class

     
    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
     
    public class ViewGui extends JFrame{
     
    	private static final long serialVersionUID = 1L;
    	public JButton button = new JButton("click me!");
     
    	public ViewGui(){
    	setTitle("Main Window");
    	setSize(200,200);
    	Container c = getContentPane();
        c.setLayout(new BorderLayout());
        c.add(button,   BorderLayout.NORTH);
     
     
    	}
     
     
    	public void addStudentListener(ActionListener m){
    			button.addActionListener(m);
    		}
    }

    The main

     
    public class SwingMainMethod {
     
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
     
    		 Student student = new Student();
    	      ViewGui view = new ViewGui() ;
    	      Controller c = new Controller(view,student);
    	}
     
    }

    Last edited by help_desk; August 21st, 2014 at 04:49 PM. Reason: MCVE format


  2. #2
    Crazy Cat Lady KevinWorkman's Avatar
    Join Date
    Oct 2010
    Location
    Washington, DC
    Posts
    5,424
    My Mood
    Hungover
    Thanks
    144
    Thanked 636 Times in 540 Posts

    Default Re: Working with custom JList Component in Java

    If you want help, you should provide an MCVE that demonstrates exactly what you're doing, in a way that we can just copy and paste into our own IDEs and run. This shouldn't be your whole project; it should be just enough lines to show the problem. Eliminate anything not directly related to the problem.
    Useful links: How to Ask Questions the Smart Way | Use Code Tags | Java Tutorials
    Static Void Games - Play indie games, learn from game tutorials and source code, upload your own games!

  3. #3
    Member
    Join Date
    Jun 2014
    Posts
    77
    Thanks
    14
    Thanked 0 Times in 0 Posts

    Default Re: Working with custom JList Component in Java

    Hello ,

    I don't know if the MVCE I have provided is OK. I think this should work and still be understandable. I have implemented the observer pattern as well as the MVC to make things clearer. So, the classes are divided into model, view and controller.

  4. #4
    Super Moderator
    Join Date
    Jun 2013
    Location
    So. Maryland, USA
    Posts
    5,517
    My Mood
    Mellow
    Thanks
    215
    Thanked 698 Times in 680 Posts

    Default Re: Working with custom JList Component in Java

    Let me say it a different way: Post something that we can run that demonstrates the problem. I don't see a main() method in what you've posted and shouldn't have to create one to make your program go.

    There's something wrong here:

    if(b =="push me!")

    If you added a print() statement to that actionPerformed() method, you'd probably find that the if() clause is not executing.

  5. #5
    Member
    Join Date
    Jun 2014
    Posts
    77
    Thanks
    14
    Thanked 0 Times in 0 Posts

    Default Re: Working with custom JList Component in Java

    Sorry Greg, I have added the main and made some adjustment to the if() condition. Let me know if you are able to run the code now.

    Thanks

  6. #6
    Super Moderator
    Join Date
    Jun 2013
    Location
    So. Maryland, USA
    Posts
    5,517
    My Mood
    Mellow
    Thanks
    215
    Thanked 698 Times in 680 Posts

    Default Re: Working with custom JList Component in Java

    Have you run it? Are you getting errors? The code you posted will not compile and run. I don't see how the code you've posted could possibly be displaying a button to press.

  7. #7
    Member
    Join Date
    Jun 2014
    Posts
    77
    Thanks
    14
    Thanked 0 Times in 0 Posts

    Default Re: Working with custom JList Component in Java

    Hello Greg, I have run everything and all is fine now. So, now when you run the code and hit the "click me!" button, instead of it to go the lines below from the controller class and fire up the JList component and show those students added, it just doesn't do that. That is what I am trying to figure out..

     
    class AddStudentListener implements ActionListener {
    	   public void actionPerformed(ActionEvent e) {
    			if (e.getActionCommand().equals("click me!")) {
     
    				//JOptionPane.showMessageDialog(null, "Button was clicked!");
     
    				view.setVisible(false);
    				studentList = new StudentList(); // initialize the JList model
    				Student studenta = new Student();
    				studenta.setStudentName("Lance");
    				studenta.setStudentId("01");
    				studentList.add(studenta); // add the student
    				Student studentb = new Student();
    				studentb.setStudentName("John");
    				studentb.setStudentId("02");
    				studentList.add(studentb); // add the student
    				JPanel panel = new JPanel();
    				@SuppressWarnings("unchecked")
    				JList<Student> list = new JList<Student>(studentList);
    				panel.add(list);
    				list.setVisibleRowCount(3);
    				list.setFont(new Font("Tahoma", Font.PLAIN, 14));
    				list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    				list.setBounds(0, 0, 100, 400);
    				panel.setVisible(true);
     
     
    			}
    	                     }
    					}
    Last edited by help_desk; August 21st, 2014 at 04:20 PM.

  8. #8
    Senior Member
    Join Date
    Jul 2013
    Location
    Europe
    Posts
    666
    Thanks
    0
    Thanked 121 Times in 105 Posts

    Default Re: Working with custom JList Component in Java

    Many lines in your code look questionable.
    Why do you need to supress warnings? usually that is a sign of bad coding or even errors. Those warnings are there for a good reason.
    Why do you call the "setBounds" method on your JList? These kinds of methods should not be used when working with swing. Instead, select the apropriate layout manager and add your JList correctly.
    You also create a new JPanel, but I can not see where you add this JPanel to any JFrame or other top level container. If the panel is not part of any GUI it will obviously not be shown.

  9. #9
    Super Moderator
    Join Date
    Jun 2013
    Location
    So. Maryland, USA
    Posts
    5,517
    My Mood
    Mellow
    Thanks
    215
    Thanked 698 Times in 680 Posts

    Default Re: Working with custom JList Component in Java

    Since comments are sparse, describe what the actionPerformed() method is supposed to be doing. Start by explaining why the view is removed from view?

    After you've decided what to do with that . . .

    It's not recommended to add or remove components to containers after the container has been displayed. Primarily because the container doesn't know to repaint when components are removed, added, etc, though you'd think it would. JFrame doesn't even have the repaint() method available. However, calling pack() or revalidate() will cause the JFrame to rebuild and repaint. pack() may also adjust the size of the JFrame to accommodate changes in the new component's sizes. revalidate() should not do that. Experiment with both to see the different results.

  10. #10
    Member
    Join Date
    Jun 2014
    Posts
    77
    Thanks
    14
    Thanked 0 Times in 0 Posts

    Default Re: Working with custom JList Component in Java

    Quote Originally Posted by Cornix View Post
    Many lines in your code look questionable.
    Why do you need to supress warnings? usually that is a sign of bad coding or even errors. Those warnings are there for a good reason.
    Why do you call the "setBounds" method on your JList? These kinds of methods should not be used when working with swing. Instead, select the apropriate layout manager and add your JList correctly.
    You also create a new JPanel, but I can not see where you add this JPanel to any JFrame or other top level container. If the panel is not part of any GUI it will obviously not be shown.
    I have added a top level container now. The JFrame. The component fires up but then, how would I rewrite my custom JList model so I can only display the names and not the IDs of the students?

    --- Update ---

    Quote Originally Posted by GregBrannon View Post
    Since comments are sparse, describe what the actionPerformed() method is supposed to be doing. Start by explaining why the view is removed from view?

    After you've decided what to do with that . . .

    It's not recommended to add or remove components to containers after the container has been displayed. Primarily because the container doesn't know to repaint when components are removed, added, etc, though you'd think it would. JFrame doesn't even have the repaint() method available. However, calling pack() or revalidate() will cause the JFrame to rebuild and repaint. pack() may also adjust the size of the JFrame to accommodate changes in the new component's sizes. revalidate() should not do that. Experiment with both to see the different results.
    Beginning after the if() statement in the actionPerformed() method
    1. set the visibility of the main component to false. This I did so as not to have the main component displayed while the JList component fires up. So, I needed to have just 1 component displayed at a time. I quite understand your worries. I could add an extra button to serve as a "back to mainWindow" functionality.

    2.Initialize my custom JList model
    3.Added two students: studenta and studentb
    4.Then added them to the studentList instance of the custom JList model
    5.Created a JFrame container and added the JList panel created to it.
    6.Then set the visibility of the JFrame to true so it would be displayed.

    Now, it does display those two added students but now, I need help on how to further customize my custom JList model so I can either choose to display the names of the students only or their IDs only.

    Thanks

  11. #11
    Super Moderator
    Join Date
    Jun 2013
    Location
    So. Maryland, USA
    Posts
    5,517
    My Mood
    Mellow
    Thanks
    215
    Thanked 698 Times in 680 Posts

    Default Re: Working with custom JList Component in Java

    Created a JFrame container and added the JList panel created to it.
    This was unnecessary. The 'view' object *is* a JFrame so was serving as the top-level container. Once you set the view invisible and then build another JFrame, you've made the view object (and the ViewGui class) irrelevant. But if you're happy with the current design, ignore me.

  12. #12
    Member
    Join Date
    Jun 2014
    Posts
    77
    Thanks
    14
    Thanked 0 Times in 0 Posts

    Default Re: Working with custom JList Component in Java

    Hi Greg,

    It's ok. I accept your advice. Might even look into it later. Meanwhile, I am displaying the student on the JList but a student has a name and an ID. How would I modify my custom JList Model to only store the names of the students and NOT their IDs?

  13. #13
    Senior Member
    Join Date
    Jul 2013
    Location
    Europe
    Posts
    666
    Thanks
    0
    Thanked 121 Times in 105 Posts

    Default Re: Working with custom JList Component in Java

    You dont modify the Model if you want to change the way they are displayed. You have to write your own ListCellRenderer for that.
    You can extend the DefaultListCellRenderer and go from there. A custom ListCellRenderer might look like this:
    public class CustomListCellRenderer extends DefaultListCellRenderer {
    	private static final long serialVersionUID = 1L;
     
    	public Component getListCellRendererComponent(
    			JList<?> list, Object value,
    			int index, boolean isSelected, boolean cellHasFocus) {
     
    		Component result = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
     
    		if (result instanceof JLabel && value instanceof MyClass) {
     
    			JLabel lbl = (JLabel) result;
    			MyClass obj = (MyClass) value;
     
    			// setup the label with the values of obj...
    		}
     
    		return result;
    	}
     
    }

  14. #14
    Member
    Join Date
    Jun 2014
    Posts
    77
    Thanks
    14
    Thanked 0 Times in 0 Posts

    Default Re: Working with custom JList Component in Java

    Hi Conix,

    Ok, I will try to study that as I don't know much about it and see if I can get it done . Should there be some stuffs I couldn't get, hope you will be willing to assist me? Thanks.

  15. #15
    Member
    Join Date
    Jun 2014
    Posts
    77
    Thanks
    14
    Thanked 0 Times in 0 Posts

    Default Re: Working with custom JList Component in Java

    Quote Originally Posted by Cornix View Post
    You dont modify the Model if you want to change the way they are displayed. You have to write your own ListCellRenderer for that.
    You can extend the DefaultListCellRenderer and go from there. A custom ListCellRenderer might look like this:
    public class CustomListCellRenderer extends DefaultListCellRenderer {
    	private static final long serialVersionUID = 1L;
     
    	public Component getListCellRendererComponent(
    			JList<?> list, Object value,
    			int index, boolean isSelected, boolean cellHasFocus) {
     
    		Component result = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
     
    		if (result instanceof JLabel && value instanceof MyClass) {
     
    			JLabel lbl = (JLabel) result;
    			MyClass obj = (MyClass) value;
     
    			// setup the label with the values of obj...
    		}
     
    		return result;
    	}
     
    }

    Hi Conix,

    Please, I need some clarifications. I have done abit study but I need to understand somethings from your code as most examples are NOT so explanatory. Which of my classes given in the MVCE would fit the MyClass variable and the JLabel variable in the DefaultListCellRender?

    --- Update ---

    Quote Originally Posted by help_desk View Post
    Hi Conix,

    Ok, I will try to study that as I don't know much about it and see if I can get it done . Should there be some stuffs I couldn't get, hope you will be willing to assist me? Thanks.
    OK Conix, below is how I wrote the class but while it is working, I would need you to explain your own version to me. I still don't know how to setText in your own version and also what the "MyClass" and "JLabel" variables represent according to the classes I presented. If you could be kind enough to explain to me using my own version as well as incorporate it into yours so I can get a better understanding of your own version.

     
     
    import java.awt.Component;
     
    import javax.swing.DefaultListCellRenderer;
    import javax.swing.JLabel;
    import javax.swing.JList;
     
    import Student;
     
    public class CustomListCellRenderer extends DefaultListCellRenderer {
     
    	private static final long serialVersionUID = 1L;
     
    	public Component getListCellRendererComponent(
    			JList<?> list, Object value,
    			int index, boolean isSelected, boolean cellHasFocus) {
     
    		//Component result = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    		Student student = (Student)value;
    		setText(student.getStudentName());
     
     /*
    		if (result instanceof JLabel && value instanceof MyClass) {
     
    			JLabel lbl = (JLabel) result;
    			MyClass obj = (MyClass) value;
     
    			// setup the label with the values of obj...
     
    		}
    		*/
     
    		return this;
    		//return result;
    	}
     
    }

  16. #16
    Senior Member
    Join Date
    Jul 2013
    Location
    Europe
    Posts
    666
    Thanks
    0
    Thanked 121 Times in 105 Posts

    Default Re: Working with custom JList Component in Java

    A JLabel is the JComponent that is usually used to display text in a Swing application.
    For example the Text next to a radio button, or for entries in a JList.
    Its a class from the standard library: JLabel (Java Platform SE 7 )


    The MyClass was just a placeholder for whatever class you want to use in your ListModel.
    If your ListModel contains Objects of type Student then use Student instead of MyClass.

    By the way, you are not calling the getListCellRendererComponent method from the super class which can be quite a problem.
    If you are uncertain what it actually does you can always just have a look at the source code:
    GC: DefaultListCellRenderer - javax.swing.DefaultListCellRenderer (.java) - GrepCode Class Source

  17. #17
    Member
    Join Date
    Jun 2014
    Posts
    77
    Thanks
    14
    Thanked 0 Times in 0 Posts

    Default Re: Working with custom JList Component in Java

    Quote Originally Posted by Cornix View Post
    A JLabel is the JComponent that is usually used to display text in a Swing application.
    For example the Text next to a radio button, or for entries in a JList.
    Its a class from the standard library: JLabel (Java Platform SE 7 )


    The MyClass was just a placeholder for whatever class you want to use in your ListModel.
    If your ListModel contains Objects of type Student then use Student instead of MyClass.

    By the way, you are not calling the getListCellRendererComponent method from the super class which can be quite a problem.
    If you are uncertain what it actually does you can always just have a look at the source code:
    GC: DefaultListCellRenderer - javax.swing.DefaultListCellRenderer (.java) - GrepCode Class Source


     
     
    import java.awt.Color;
    import java.awt.Component;
     
    import javax.swing.DefaultListCellRenderer;
    import javax.swing.JLabel;
    import javax.swing.JList;
     
    import Student;
     
    public class CustomListCellRenderer extends DefaultListCellRenderer {
     
    	private static final long serialVersionUID = 1L;
    	private static final Color HIGHLIGHT_COLOR = new Color(0, 0, 128);
     
    	public CustomListCellRenderer(){
    		setOpaque(true);
    	        setIconTextGap(12);
    	}
     
    	public Component getListCellRendererComponent(
    			JList<?> list, Object value,
    			int index, boolean isSelected, boolean cellHasFocus) {
     
     
    		Component result = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
     
     
    		if (isSelected) {
    		      setBackground(HIGHLIGHT_COLOR);
    		      setForeground(Color.white);
    		    } else {
    		      setBackground(Color.white);
    		      setForeground(Color.black);
    		    }
     
     
     
     
    		if (result instanceof JLabel && value instanceof Student) {
     
    			JLabel lbl = (JLabel) result;
    			Student obj = (Student) value;
     
    			// setup the label with the values of obj...
    			lbl.setText(obj.getStudentName());
    			lbl.setText(obj.getStudentId());
    		}
     
     
     
    		return result;
    	}
     
    }

    That is the final code I came up with. I noticed that I can't list the name and the id columnwise. In the if() condition lbl.setText(obj.getStudentId()) is only displayed even though there is also the lbl.setText(obj.getStudentName()). Does this mean that I can only render the name and not the Id as well?

  18. #18
    Senior Member
    Join Date
    Jul 2013
    Location
    Europe
    Posts
    666
    Thanks
    0
    Thanked 121 Times in 105 Posts

    Default Re: Working with custom JList Component in Java

    A label has only one text. If you call setText twice in a row only the last value will actually be displayed.
    But you can of course concatenate your strings to display both values.
    For example:
    lbl.setText(obj.getStudentName() + "\t" + obj.getStudentId());

    If this is not good enough you might instead use a JTable in place of the JList.

  19. The Following User Says Thank You to Cornix For This Useful Post:

    help_desk (August 23rd, 2014)

  20. #19
    Member
    Join Date
    Jun 2014
    Posts
    77
    Thanks
    14
    Thanked 0 Times in 0 Posts

    Default Re: Working with custom JList Component in Java

    @Cornix, thanks alot. you have been patient and gentle to my questions. I appreciate.

  21. #20
    Member
    Join Date
    Jun 2014
    Posts
    77
    Thanks
    14
    Thanked 0 Times in 0 Posts

    Default Re: Working with custom JList Component in Java

    @Conix, please could I just ask you a question? Instead of JList, could I use a JComboBox with the DefaultListCellRender?

  22. #21
    Senior Member
    Join Date
    Jul 2013
    Location
    Europe
    Posts
    666
    Thanks
    0
    Thanked 121 Times in 105 Posts

    Default Re: Working with custom JList Component in Java

    A combo box is just a list. So if your problem comes with properly displaying the values it would not help you since it uses the same Renderer (a ListCellRenderer).
    If you actually want to have several columns of displayed data you are pretty much forced to use a table instead. Or you write a completely new ListCellRenderer that does not extend the DefaultListCellRenderer.
    But I am not sure which of these options would require more work.

  23. #22
    Member
    Join Date
    Jun 2014
    Posts
    77
    Thanks
    14
    Thanked 0 Times in 0 Posts

    Default Re: Working with custom JList Component in Java

    Thanks alot @Cornix. Supposing the JList lists the names of the student and I wanted to click on a name so an event is fired that would do something else..any pointer or idea on how to fire such event? I am just trying to imagine the names to be some button and when these names are clicked, like a button an event is fired. How would I do that in my custom DefaultListCellRenderer?

  24. #23
    Senior Member
    Join Date
    Jul 2013
    Location
    Europe
    Posts
    666
    Thanks
    0
    Thanked 121 Times in 105 Posts

    Default Re: Working with custom JList Component in Java

    A renderer does not fire events. It only displays things.
    This kind of event does already exist in the JList, its called the ListSelectionListener (or something similar), just google it and you will find the official documentation.
    It is, in general, a good idea to look up the jdoc of whatever class you want to work with, in this case the JList. There you can find all listeners supported by the class.

Similar Threads

  1. KeyListener not working for JLIST Component.
    By nageshvk in forum AWT / Java Swing
    Replies: 1
    Last Post: May 5th, 2014, 05:58 AM
  2. How to create a custom Swing Component?
    By Pahulja7 in forum AWT / Java Swing
    Replies: 1
    Last Post: November 25th, 2011, 10:55 AM
  3. Custom JList
    By daghost in forum AWT / Java Swing
    Replies: 3
    Last Post: November 17th, 2011, 05:57 PM
  4. How to Use the JList component - Java Swing
    By neo_2010 in forum Java Swing Tutorials
    Replies: 1
    Last Post: July 11th, 2009, 04:02 AM
  5. How to Use the JList component - Java Swing
    By neo_2010 in forum Java Code Snippets and Tutorials
    Replies: 1
    Last Post: July 11th, 2009, 04:02 AM

Tags for this Thread