Hola:
La llamada a setPreferredSize() en la mayoría de los componentes es totalmente inútil. Los componentes que tienen algún contenido (como los JButton), devuelven en getPreferredSize() el tamaño que necesitan para mostrar ese contenido y no el que se ha fijado con setPreferredSize().
Si quieres dar tamaño a uno de estos componentes, tienes varias opciones.
Una es que el contenedor donde vayas a meterlos tenga un layout adecuado y que sea menos "complaciente" con el tamaño deseado de los componentes que hay dentro. Un GridLayout hace que todos loc componentes tengan el mismo tamaño, independientemente de cual quiera tener cada uno. Un GridBagLayout te da bastante control sobre el tema, ya que puedes decidir si quieres que el componente se estire o no para ocupar todo el espacio disponible o incluso qué porcentaje del espacio debe ocupar.
Otra opción es llamar a los métodos setMinimumSize() y/o setMaximumSize() del componente. Creo que esos sí se respetan, aunque tampoco lo tengo claro.
Finalmente, la opción que seguro que funciona, es heredar del JButton y sobreescribir el método getPreferredSize() para que devuelva lo que tú quieras.
JButton boton = new JButton () {
public Dimension getPreferredSize() {
return new Dimension(.....);
}
}
Se bueno.