Java Swing - Cambiar el ancho de un TextField, parece fácil, no?

Escrito por Lyoneel el en programación, kotlin, user-interfaces
 2 mins

Java Swing - Cambiar el ancho de un TextField, parece fácil, no?

“Well yes, but actually no”

Estaba experimentando con Intellij Plugin SDK usando Kotlin US DSL v2, técnicamente no es Java Swing puro. Cree este tab para ver visualmente cuando el width (ancho) se aplicaba y cuando era ignorado.

Image showing unpredictable behavior with different instantiations of a texfield and setters

Cuando dice “extension” significa que se está utilizando una extensión sobre las clases de la librería:

fun Component.setPreferredWidth(width: Int){
    this.preferredSize = Dimension(width, this.preferredSize.height)
}

Esta extensión fue creada porque como se puede ver en el ejemplo, si Dimension no es un nuevo objeto, el nuevo valor en size no se aplica, también la función está lidiando con los valores anteriores de height o width cuando estás alterando sólo uno de ellos.

Espero que no pierdas el tiempo como yo, estoy lejos de ser un experto en Java Swing, pero en mi opinión no es un comportamiento correcto.

Dejo el source code del tab aquí:


fun getTab(): JPanel {
    val testWidth = 150
    return panel {
        indent {
            row("textField from rowConstructor: ") {
                textField()
            }

            row("textField from rowConstructor with RowLayout.PARENT_GRID: ") {
                textField()
            }.layout(RowLayout.PARENT_GRID)

            row("textField from JBTextField object ") {
                val jbTextField = JBTextField()
                cell(jbTextField)
            }

            row("textField from JBTextField object with cell.horizontalAlign.FILL") {
                val jbTextField = JBTextField()
                cell(jbTextField).horizontalAlign(HorizontalAlign.FILL)
            }

            row("textField from JBTextField set $testWidth to width using size.width") {
                val jbTextField = JBTextField()
                jbTextField.size.width = testWidth
                cell(jbTextField)
            }

            row("textField from JBTextField set $testWidth to width using size.setWidth extension") {
                val jbTextField = JBTextField()
                jbTextField.setWidth(testWidth)
                cell(jbTextField)
            }

            row("textField from JBTextField set $testWidth to width using preferredSize.width") {
                val jbTextField = JBTextField()
                jbTextField.preferredSize.width = testWidth
                cell(jbTextField)
            }

            row("textField from JBTextField set $testWidth to width using size.setPreferredWidth extension") {
                val jbTextField = JBTextField()
                jbTextField.setPreferredWidth(testWidth)
                cell(jbTextField)
            }

            row("textField from JBTextField set $testWidth to width using minimumSize.width") {
                val jbTextField = JBTextField()
                jbTextField.minimumSize.width = testWidth
                cell(jbTextField)
            }

            row("textField from JBTextField set $testWidth to width using size.setMinimumWidth extension") {
                val jbTextField = JBTextField()
                jbTextField.setMinimumWidth(testWidth)
                cell(jbTextField)
            }
        }
    }
}

Gracias por leer!

Namaste.