No mercado desktop, o java sempre ficou atrás do VB, do delphi, do C, do C++ e de outras linguagens. Não sei como é o caso do C# / .NET, mas acredito que estão muito mais a frente que o java.
O que acontece é que criar interfaces visuais no java é uma tarefa árdua e muito mais trabalhosa que em qualquer outra linguagem, principalmente por conta daqueles gerenciadores de layout pobres, pouco usáveis e non-sense. Há ferramentas e APIs de terceiros por aí que deixam esse trabalho mais tranquilo, mas mesmo assim é muito mais fácil fazer em VB ou delphi.
Não obstante, a API do swing não está entre as melhores. Cheio de regras estranhas e desnecessariamente complicadas que são produto de uma especificação mal-planejada (ex: setar o foco, JTable, usar a Event-Dispatch-Thread corretamente). Há vários métodos que deveriam ser privados, mas estão expostos como públicos, há uso excessivo de herança, o que deixa a documentação difícil de entender e a API difícil de aprender. Além disso, boa parte dos mitos dos java (ex: “java é lento” e “java é uma linguagem cheia de frescuras”) tem certa parcela de culpa no swing. Ainda mais que só no java 5 é que o swing começou a ter uma performance decente. Curiosamente a performance no java 6 é em geral superior ao do delphi, mas o java demorou demais para conseguir isso. Quanto a parte das frescuras, é tanta regra e restrição idiota, que sem dúvida dá para dizer com plena convicção de que o swing é cheio de frescuras.
Eu acredito que se a API do swing e do AWT fosse mais bem planejada e principalmente, mais fácil de ser usada e aprendida, hoje o pessoal estaria falando de VB e delphi da mesma forma que falariam do clipper.
Recentemente chegou o JavaFX para tentar salvar a situação, vamos torcer.
No entanto, apesar disso, o swing ainda tem algum espaço no mercado, pouco mas tem. Eu pessoalmente já trabalhei em três projetos comerciais sérios usando swing, de 2006 para cá.