"In order to learn you must desire to learn, and in so desiring not be satisfied with what you already incline to think" - Charles Peirce
Knowledge derives from answers, which derives from questions, which derive from interest. To learn, you must wonder and ask questions.
Forcing knowledge can lead to rushing. This results in gaps. If you do not have interest in it, do not force yourself to learn it.
Make sure you are familiar with everything you currently think you know. There are TONS of programming pitfalls which you must be aware of when working on the field.
Look for subjects that actually interest you. Many things are tied together; learning one aspect could lead you into learning another. If you have interest, you will ask more questions. Try not to make learning a chore.
Observe the thoughts of other great developers. Joshua Bloch is one of my favorite developers, although the list of developers I actually follow is rediculous. They could say something that may inspire you to think in a different, more innovative way. A quote that really got to me: "An API should not only be easy to use, but hard to misuse"
Don't limit yourself to one language. A lot of new languages are arising, bringing along a lot of innovation and long awaited features. Getting familiar with other language can really strengthen your overall view on programming. You'll find a lot of flaws in other languages, making you reconsider what you think is best for certain situations.
Meet other programmers and exchange code. This is always a great way to learn new things. Although beware; if you don't do indepenedent research on what you learn from your partner's code, you could gain bad habits. Search and research.
Some neat Java books (will be adding more; it's been a while since I've read any programming books ):
Effective Java
Code Complete
Filthy Rich Clients
Refactoring
Java Puzzlers
Hardcore Java
Inmates Are Running The Asylum