The best way to learn is practice. The more you write, the better you get. Find something you enjoy and see if you can't work programming into it. For example, this could be writing a game.
It sounds like you have an understanding of the semantics/syntax, I would say the next step is to learn more about the "computer science" part of programming. At this point the actual language isn't too important, but it's the design and thought process which is important. Knowing what algorithm or data structure to use in different situations can mean the difference between a program which is extremely efficient and one which won't finish in trillions of years (or longer). There are also several different programming paradigms/patterns which are quite useful for different situations. Learning what they are and when to use them can help you to write better code. Unfortunately, I can't think of any good resource to learn about these (Wikipedia's not a bad place to start), so I'll list a few which come to mind and you can search for more about these by yourself:
2. Tree data structures (too many to list, see wikipedia)
5. Dynamic programming
7. Model-view-controller (MVC) for GUI programming
8. Lists (linked lists, arraylists)
9. Divide and conquer algorithms and recursion