Java-Gaming.org    
Featured games (81)
games approved by the League of Dukes
Games in Showcase (499)
Games in Android Showcase (118)
games submitted by our members
Games in WIP (568)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1] 2
  ignore  |  Print  
  AWT stuff is not reliable  (Read 8517 times)
0 Members and 1 Guest are viewing this topic.
Offline alexxz4

Junior Member


Projects: 1



« Posted 2008-02-27 16:19:28 »

Hi,
Im using AWT buttons and checkboxes in an applet. Often the AWT components do not show, even though they are set on visible. I tried everything including moving them around, enabling them (setEnable()), repainting them in different places... Nothing works.  Angry

Alex

[ Motherload Unlimited looking for programmers ] [ Solitaire ]
Offline erikd

JGO Ninja


Medals: 16
Projects: 4
Exp: 14 years


Maximumisness


« Reply #1 - Posted 2008-02-27 18:42:34 »

Care to post some code?

Offline alexxz4

Junior Member


Projects: 1



« Reply #2 - Posted 2008-02-27 21:07:25 »

I wish i could, its over 1000 lines. I couldnt replicate it on a small scale. I mean there is gotta be something buggy about Buttons and other stuff just because their positioning and resizing has to be done in run() method. So if i put this in init() method:
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
cb1=new Checkbox("Checkbox1");
cb2=new Checkbox("Checkbox2");      
cb3=new Checkbox("Checkbox3");
b1=new Button("Button1");
b2=new Button("Button2");
b3=new Button("Button3");
add(cb1);add(cb2);add(cb3);
add(b1);add(b2);add(b3);
cb1.setLocation(20,20);            // has no effect
cb2.setLocation(20,40);// has no effect
cb3.setLocation(20,60);// has no effect
b1.setLocation(100,20);      b1.setSize(80,20);// has no effect
b2.setLocation(100,50);      b2.setSize(80,20);// has no effect
b3.setLocation(100,80);      b3.setSize(80,20);// has no effect

It wont do what it is supposed to do. But ok, i position/resize them in run() method and it works fine, but making them show up when i want to is beyond me.
Another example:
I load the applet in IE first time, in the code i resize and reposition 2 buttons, they show up in wrong places. So i click the first button, this should make 4 checkboxes appear, they do.
The second time i load it in IE, the 2 buttons are in the right positions and of the right sizes. So i click the first button, and the 4 checkboxes do not show. I guess its like drawing the same picture twice, they'll always be different.
I woulda created my own buttons and checkboxes only i think i shouldnt have to.

[ Motherload Unlimited looking for programmers ] [ Solitaire ]
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline SimonH
« Reply #3 - Posted 2008-02-27 21:20:52 »

try setBounds() instead of setLocation()

People make games and games make people
Offline Riven
« League of Dukes »

JGO Overlord


Medals: 803
Projects: 4
Exp: 16 years


Hand over your head.


« Reply #4 - Posted 2008-02-27 21:26:52 »

Setting location and size has *no effect* like you noticed, when there is a layoutmanager active (which it is by default)


You might want to go through the Java Tutorial on AWT (or even Swing)

Hi, appreciate more people! Σ ♥ = ¾
Learn how to award medals... and work your way up the social rankings
Offline alexxz4

Junior Member


Projects: 1



« Reply #5 - Posted 2008-02-27 21:41:11 »

Quote
You might want to go through the Java Tutorial on AWT (or even Swing)
Well, i dont wanna waste time, designing buttons and checkboxes from ground up is much faster and more objective.
Anyways, i just wanted to see if other people had those problems and what they used to deal with them. I see that not many people are using AWT in applets, for obvious reasons...  Undecided

[ Motherload Unlimited looking for programmers ] [ Solitaire ]
Offline Mr_Light

Senior Member


Medals: 1


shiny.


« Reply #6 - Posted 2008-02-27 22:33:51 »

Well, i dont wanna waste time, designing buttons and checkboxes from ground up is much faster and more objective.
Because reinventing the wheel is just efficient.

Anyways, i just wanted to see if other people had those problems and what they used to deal with them. I see that not many people are using AWT in applets, for obvious reasons...  Undecided
Before swing came along everyone used AWT and some complained about it's speed mostly. These days we use swing and ppl complain about new things. I'm afraid your the first with these complains.

fixed layouts don't handle differend resolutions or dpi,

Anyways try looking at the javadoc, or if that is pulling in too much information at once read the Java tutorial. Stuff 99% of the time does what it said, and is reliable it that way. If you don't read the the javadoc and gues away at things then it probebly doesn't do what you expect. And yes I gues in that way it isn't reliable.  Roll Eyes

perhaps I'm harsh  Undecided

It's harder to read code than to write it. - it's even harder to write readable code.

The gospel of brother Riven: "The guarantee that all bugs are in *your* code is worth gold." Amen brother a-m-e-n.
Offline CaptainJester

JGO Knight


Medals: 12
Projects: 2
Exp: 14 years


Make it work; make it better.


« Reply #7 - Posted 2008-02-27 22:39:12 »

Well, i dont wanna waste time, designing buttons and checkboxes from ground up is much faster and more objective.
Anyways, i just wanted to see if other people had those problems and what they used to deal with them. I see that not many people are using AWT in applets, for obvious reasons...  Undecided
The obvious reason is that you are using it incorrectly.  You spend more time trying to work around things or just create your own buttons than you would if you just read The Java Tutorial.  People ask these questions all the time and most of the people that have the answers have read The Java Tutorial.

With the code you posted the first thing I can think of this that you didn't do setLayout(null) on your container. 

If your code is that long, post it somewhere in a zip file and place a link here so we can download it and see what's wrong.

Offline SimonH
« Reply #8 - Posted 2008-02-28 01:26:57 »

Well, i dont wanna waste time, designing buttons and checkboxes from ground up is much faster and more objective.

I agree! Layout managers are useless. Try setLayoutManager(null)

People make games and games make people
Offline cylab

JGO Ninja


Medals: 50



« Reply #9 - Posted 2008-02-28 11:02:56 »

Quote
I agree! Layout managers are useless. Try setLayoutManager(null)
Layout managers have their purpose. Think of dynamic texts in labels and buttons due to internationalization. Also keep in mind, that there are different DPI settings for different users, so the texts might overflow your hand designed button sizes on highres notebooks etc.

Mathias - I Know What [you] Did Last Summer!
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline erikd

JGO Ninja


Medals: 16
Projects: 4
Exp: 14 years


Maximumisness


« Reply #10 - Posted 2008-02-28 12:29:45 »

Quote
Well, i dont wanna waste time, designing buttons and checkboxes from ground up is much faster and more objective.
So you'd rather waste my time?  Tongue Kiss
I don't mean to sound harsh, but learning how stuff works first (instead of complaining that AWT buttons are buggy when you don't understand why they don't behave like you expect) is never a waste of time if you ask me... Understanding that you don't understand something is a good start.

Anyway, if you keep having problems, post or upload your code somewhere.

Quote
Layout managers are useless. Try setLayoutManager(null)
I *never* use setLayout(null). Once you get the hang of LayoutManagers, they make good GUI design a lot easier (IMHO) and prevent numerous problems (as cylab pointed out).
Using setLayout(null) might work for trivial cases, but I'd rather be on the safe side.

Offline CaptainJester

JGO Knight


Medals: 12
Projects: 2
Exp: 14 years


Make it work; make it better.


« Reply #11 - Posted 2008-02-28 12:55:19 »

I *never* use setLayout(null). Once you get the hang of LayoutManagers, they make good GUI design a lot easier (IMHO) and prevent numerous problems (as cylab pointed out).
Using setLayout(null) might work for trivial cases, but I'd rather be on the safe side.

I agree 100%.  I have never had a problem making layout managers do what I want them to do.

Offline alexxz4

Junior Member


Projects: 1



« Reply #12 - Posted 2008-02-28 14:01:36 »

Quote
I don't mean to sound harsh, but learning how stuff works first (instead of complaining that AWT buttons are buggy when you don't understand why they don't behave like you expect) is never a waste of time if you ask me... Understanding that you don't understand something is a good start.
I dont mean to sound harsh, but its very easy to say "Maybe you should read the tutorial". I could say that all the time even if i didnt know a thing.

Ok, if im drawing this string on the screen:
> g.drawString(""+checkbox.isVisible(),400,20);
and it draws
> true
but the checkbox is not on the screen (and its location is within the viewing area), what else am i supposed to do?
I could waste my time trying all the different things to make it appear or read the (300 page) swing tutorial, to find out after all that that it didnt help me, i would be forced to reinvent the wheel anyways. So thats what i done, i created my own checkboxes and buttons; works like butter.
Quote
Because reinventing the wheel is just efficient.
Yeah, i agree, more efficient than reading a tutorial.  Roll Eyes

[ Motherload Unlimited looking for programmers ] [ Solitaire ]
Offline CaptainJester

JGO Knight


Medals: 12
Projects: 2
Exp: 14 years


Make it work; make it better.


« Reply #13 - Posted 2008-02-28 15:16:04 »

I dont mean to sound harsh, but its very easy to say "Maybe you should read the tutorial". I could say that all the time even if i didnt know a thing.
You are sounding harsh, because you come here for help and the people are trying to help and your just blowing off their answers.  You are also in a community where people want to help each other.  We're not going to just throw out lame advice for the hell of it.  We're speaking from experience.

Ok, if im drawing this string on the screen:
> g.drawString(""+checkbox.isVisible(),400,20);
and it draws
> true
but the checkbox is not on the screen (and its location is within the viewing area), what else am i supposed to do?
How about listening to advice?  Show more code so we can figure out where you are going wrong.

I could waste my time trying all the different things to make it appear or read the (300 page) swing tutorial, to find out after all that that it didnt help me, i would be forced to reinvent the wheel anyways. So thats what i done, i created my own checkboxes and buttons; works like butter.
Yeah works like butter now, but when you want to have a new feature you'll spend countless hours adding and debugging each feature.  That time will grow bigger and bigger as you add more features.  Swing and AWT have the combined experience of the Java community and developers over the past 12 years debugging all the features that already exist.

Offline alexxz4

Junior Member


Projects: 1



« Reply #14 - Posted 2008-02-28 16:07:38 »

OK, here is my code (with all the files and classes).
http://www.4shared.com/file/39225173/9db16f56/Game.html
I dont want you to get wild with it, just press 'Quiz' button when it loads.
On line 468 i draw some stuff about 'submit' button. As u see, its visible yet its not showing. Im not even complaining about 'Quiz' and 'Atlas' buttons on the start page in convoluted places, at least THEY ARE THERE (I set their positions and sizes in positionAWT() function, line 1030. For some reason java decided to position all the buttons in correct places except those 2  Huh). The four checkboxes are not there also.
Sorry for putting all that coding monstrosity here. Its just that it functions fine if the program is smaller, i noticed.

[ Motherload Unlimited looking for programmers ] [ Solitaire ]
Offline Mr_Light

Senior Member


Medals: 1


shiny.


« Reply #15 - Posted 2008-02-29 01:51:30 »

ok missing 3 classes, Info, InfoStorage, CityInfo, so I can't test.

also what a monster class, I can dump 100 best practices on you right now but'll start with stuff which has a direct effect.

try changing:
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
public void show_popup(String msg) {
   pop_up = new Frame("GeoQuiz");
   popup_label = new Label(msg);
   b_ok = new Button("OK");
   b_ok.setSize(50, 30);
   b_ok.setLocation(85, 35);
   pop_up.add(b_ok);
   pop_up.add(popup_label);
   pop_up.setSize(200, 100);
   pop_up.setLocation(700, 220);
   pop_up.setVisible(true);
   b_ok.addActionListener(this);
   pop_up.addWindowListener(this);
}


with:

http://java.sun.com/docs/books/tutorial/uiswing/components/dialog.html
//custom title, no icon
JOptionPane.showMessageDialog(frame,
    "Eggs are not supposed to be green.",
    "A plain message",
    JOptionPane.PLAIN_MESSAGE);

1  
2  
3  
public void show_popup(String msg) {
   JOptionPane.showMessageDialog(this,  msg, "Info", JOptionPane.PLAIN_MESSAGE);
}


As for the layout issue if your gonna specify sizes and places you should adleast setLayout(null);

On a other note study has shown that in general users don't like components popping up out of no where/disappearing. Disable is preferred.

It's harder to read code than to write it. - it's even harder to write readable code.

The gospel of brother Riven: "The guarantee that all bugs are in *your* code is worth gold." Amen brother a-m-e-n.
Offline erikd

JGO Ninja


Medals: 16
Projects: 4
Exp: 14 years


Maximumisness


« Reply #16 - Posted 2008-02-29 09:59:33 »

Yes, you can fix your bug by adding setLayout(null); as the first line of your init() method, and call your positionAWT() method at the end of your init().
(I called it just before you called restart(). Not knowing how the rest of your code works, this kind of made sense  Smiley).
The buttons at the start screen at least now show up where you expected. I didn't test anything else but I suppose it'll solve your other layout problems as well.

Riven already suggested this in reply #4

Quote
ok missing 3 classes, Info, InfoStorage, CityInfo, so I can't test.
The classes are there as class files, just add them to your classpath

Offline Mr_Light

Senior Member


Medals: 1


shiny.


« Reply #17 - Posted 2008-02-29 14:16:26 »

yeah I noticed.  Tongue

It's harder to read code than to write it. - it's even harder to write readable code.

The gospel of brother Riven: "The guarantee that all bugs are in *your* code is worth gold." Amen brother a-m-e-n.
Offline alexxz4

Junior Member


Projects: 1



« Reply #18 - Posted 2008-02-29 16:06:01 »

Quote
also what a monster class, I can dump 100 best practices on you right now but'll start with stuff which has a direct effect.
As u probably noticed, this is not a complete project. I prefer "coding it out" before dealing with OOP logistics.
The pop-up window is custom made if i need to add more stuff to it. Plus, im not sure if applets support JOptionPanes (i know JApplets probably do but JApplets flicker and mess up my drawing stuff).
 
Quote
I called it just before you called restart(). Not knowing how the rest of your code works, this kind of made sense  Smiley).
The buttons at the start screen at least now show up where you expected. I didn't test anything else but I suppose it'll solve your other layout problems as well.
Yeah, it solved it, but the 4 checkboxes and the submit button are still not showing in the 'quiz' mode.
Here is how it looks with AWT buttons and checkboxes:
http://img146.imageshack.us/img146/4814/img1dd2.png
And this is what its supposed to look like (using my own Checkboxes and Buttons):
http://img150.imageshack.us/img150/2656/img2no7.png

[ Motherload Unlimited looking for programmers ] [ Solitaire ]
Offline CaptainJester

JGO Knight


Medals: 12
Projects: 2
Exp: 14 years


Make it work; make it better.


« Reply #19 - Posted 2008-02-29 16:45:05 »

(i know JApplets probably do but JApplets flicker and mess up my drawing stuff).

You need to use double buffering to stop flickering.

Offline alexxz4

Junior Member


Projects: 1



« Reply #20 - Posted 2008-02-29 17:32:20 »

Hmmm... i thought what i had in update() method was supposed to take care of double-buffering. Anyways, its not really important, im not gonna use optionpanes in this project.
Ok, to elaborate on some of my code, here is a piece of it from actionPerformed(ActionEvent e):
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
else if(e.getSource()==b_quiz){
         function=3;                        // this sets it to quiz mode
        map_index=-1;
         b_atlas.setVisible(false);   b_quiz.setVisible(false);     // this hides quiz and atlas buttons so that they dont show
        loadAsia();                   // this loads all the graphical stuff and flags of the continent
        question_mode=1;    // this mode is multiple choice question
        newQuestion(question_mode);   // this generates new question
        hideAWT(false);                // this shows all the components on the screen
        positionAWT();       // this positions and resizes buttons and checkboxes
        showComponents(question_mode);        // this hides some of the components that are not needed.
     }

This is a piece of code from showComponents() that sets visible those components that need to be shown. Notice that if mode=1, then the 4 checkboxes should be visible.
1  
2  
3  
4  
5  
6  
if(mode==1 || mode==4 || mode==6 || mode==9 || mode==11 || mode==13 || mode==16
          || mode==17){
         checkbox1.setVisible(true);   checkbox2.setVisible(true);
         checkbox3.setVisible(true);   checkbox4.setVisible(true);
         textfield.setVisible(false);
      }

Maybe those buttons that are named "submit" are never shown by java (same goes for the checkboxes). But then again, i tried renaming them and still doesnt work, so its not it. Maybe there is a limit on how many components you can have and maybe i have too many...  Undecided 
If someone would just tell me that AWT stuff is very buggy, i will use my own components cause i wont have no other choice...

[ Motherload Unlimited looking for programmers ] [ Solitaire ]
Offline broumbroum

Junior Member





« Reply #21 - Posted 2008-02-29 18:28:54 »

if you change the UI you may be asked to call for a repaint() of the whole contents. Swing or AWT, when a child component is modified the repaintManager is not necessarily notified, depending on the implementation of the components.
e.g.  for an Animation component I built myself :
1  
2  
3  
4  
5  
6  
7  
8  
 /*the player is a Swing Timer that validates the new animation frame index and THEN REPAINTS THE PARENT IF EXISTING */
new ActionListener() { public void actionPerformed(ActionEvent e) {
      validate(); // animation time ms is updated and the frame is loaded and made visible, in some way.
    if(Animation.this.getParent() instanceof Container)
              Animation.this.getParent().repaint();
     else
            repaint();
}}


This scheme must work for all Component or JComponent implementations. Roll Eyes

::::... :..... :::::: ;;;:::™ b23:production 2006 GNU/GPL @ http://b23prodtm.webhop.info
on sf.net: /projects/sf3jswing
Java (1.6u10 plz) Web Start pool
dev' VODcast[/ur
Offline alexxz4

Junior Member


Projects: 1



« Reply #22 - Posted 2008-02-29 18:39:33 »

No, like i said, repaint()'ing doesnt help.   Tongue

If its not too hard, could someone modify the source code so that it works?

[ Motherload Unlimited looking for programmers ] [ Solitaire ]
Offline Riven
« League of Dukes »

JGO Overlord


Medals: 803
Projects: 4
Exp: 16 years


Hand over your head.


« Reply #23 - Posted 2008-02-29 19:36:56 »

Us writing down the/any solution won't get you anywhere. When the next problem occurs, you'll find yourself running back to us.

One of the problems you found yourself into, is that your problem grew too big, and thus cannot be easily fixed.

When you find yourself running into any coding problem, narrow it down until you understand what is happening. At this point, it's easy to fix the bugs.





In your case, programming is not just knowing the language, it's about knowing the APIs and proper coding styles. You have to understand what your code does, and how it handles the APIs, because when you don't, you'll never know whether your code, or the API caused that bug you're seeing. It's pretty safe to assume the bug is in your code most of the time, though. When in doubt, insert lots of System.out's, to see what state your application is in, as your assumptions can be very wrong.

To be a bit more specific: either Google your way out, read a book about AWT, or keep finding yourself getting stuck all the time.  Build test-cases of a few dozen lines, where you test functionality (like: what happens when I remove a button from a panel, should I repaint/invalidate/revalidate?)

Good luck!

Hi, appreciate more people! Σ ♥ = ¾
Learn how to award medals... and work your way up the social rankings
Offline alexxz4

Junior Member


Projects: 1



« Reply #24 - Posted 2008-02-29 20:13:12 »

Quote
In your case, programming is not just knowing the language, it's about knowing the APIs and proper coding styles. You have to understand what your code does, and how it handles the APIs, because when you don't, you'll never know whether your code, or the API caused that bug you're seeing. It's pretty safe to assume the bug is in your code most of the time, though. When in doubt, insert lots of System.out's, to see what state your application is in, as your assumptions can be very wrong.
Its not a problem its a java bug. Ive seen a share of them (like the same program starting out in different states, etc.) Usually im able to work around those bugs, but not this one. I would never touch AWT if this project was only for myself, but im "supposed to" use java API.
I have a question then (i asked it before): How could a component not be visible when its state is set on visible? If there are some ambiguous functions (like setEnabledVisibility() or setVisibleWhenSettingVisible() or showComponentOnTheScreen()) that control visibility, its an API flaw, not mine.

[ Motherload Unlimited looking for programmers ] [ Solitaire ]
Offline alexxz4

Junior Member


Projects: 1



« Reply #25 - Posted 2008-02-29 20:35:39 »

OMG, i shouldve known it. When setting location of a component, you need to set its size too, otherwise it would not show. So all components, including checkboxes need to have their size set (setting a size of a checkbox has no effect by default, but u need to set its size when u change its position).  Shocked That makes hole lotta sence, no brainer. Works out pretty nice when you need to change a button's text, you would have to guess the buttons required length or use FontMetrics class. I love java OMG.
Now i know some of the experts here knew this and yet didnt tell me.  Angry

[ Motherload Unlimited looking for programmers ] [ Solitaire ]
Offline ryanm

Senior Member


Projects: 1
Exp: 15 years


Used to be bleb


« Reply #26 - Posted 2008-02-29 21:09:20 »

sigh

This what LayoutManagers do.
Offline CaptainJester

JGO Knight


Medals: 12
Projects: 2
Exp: 14 years


Make it work; make it better.


« Reply #27 - Posted 2008-02-29 21:12:13 »

How about READ THE TUTORIAL.  You are not using AWT properly and this is causing ALL of your problems.  This is not a bug in Java.  The first sign of an inexperience programmer is one who blames other code before their own.  If you learn how to use AWT properly your problems will disappear.  You spend all this time trying to figure out what is wrong when you could have been half way through the tutorial by now.

Offline alexxz4

Junior Member


Projects: 1



« Reply #28 - Posted 2008-02-29 21:53:24 »

Quote
You spend all this time trying to figure out what is wrong when you could have been half way through the tutorial by now.
Well, considering that stuff about positioning is at the end, i saved some time.
Still, normal assumption is that if you want to change position of a button only (and keep its size to default) you would only need to use setLocation() without using setBounds() and changing its size. The same goes for checkboxes, i dont see any reason why anyone would change its size. Lets use common sense, people. If everyone referred to java tutorial without making assumptions we would not get anywhere.
Anyways, its easy to blame it all on me since i was the one who found the answer. OMG.

[ Motherload Unlimited looking for programmers ] [ Solitaire ]
Offline Riven
« League of Dukes »

JGO Overlord


Medals: 803
Projects: 4
Exp: 16 years


Hand over your head.


« Reply #29 - Posted 2008-02-29 22:07:49 »

Anyways, its easy to blame it all on me since i was the one who found the answer. OMG.


You are so great.

Hi, appreciate more people! Σ ♥ = ¾
Learn how to award medals... and work your way up the social rankings
Pages: [1] 2
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

 

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

Riven (9 views)
2014-10-02 14:36:20

Pippogeek (41 views)
2014-09-24 16:13:29

Pippogeek (32 views)
2014-09-24 16:12:22

Pippogeek (22 views)
2014-09-24 16:12:06

Grunnt (47 views)
2014-09-23 14:38:19

radar3301 (30 views)
2014-09-21 23:33:17

BurntPizza (65 views)
2014-09-21 02:42:18

BurntPizza (37 views)
2014-09-21 01:30:30

moogie (44 views)
2014-09-21 00:26:15

UprightPath (53 views)
2014-09-20 20:14:06
List of Learning Resources
by Longor1996
2014-08-16 10:40:00

List of Learning Resources
by SilverTiger
2014-08-05 19:33:27

Resources for WIP games
by CogWheelz
2014-08-01 16:20:17

Resources for WIP games
by CogWheelz
2014-08-01 16:19:50

List of Learning Resources
by SilverTiger
2014-07-31 16:29:50

List of Learning Resources
by SilverTiger
2014-07-31 16:26:06

List of Learning Resources
by SilverTiger
2014-07-31 11:54:12

HotSpot Options
by dleskov
2014-07-08 01:59:08
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!