ventana una tamaño responsiva resizing redimensionar maximizar hacer evento como cambiar boton java swing resize runtime jbutton

java - una - Cómo restringir JButton para cambiar sus dimensiones como resultado de la revalidación



evento cambiar tamaño ventana java (3)

  1. Devuelve JPanel ( BorderLayout ) anidado
    • JPanel (tiene por defecto FlowLayout ) para JButton , este JPanel puesto en BorderLayout.NORTH
    • JTextArea puesto a continuación BorderLayout.CENTER
  2. No puedo ver motivo para revalidate & repaint , solo en el caso de que cambie entre JComponents o elimine y luego agregue nuevos JComponent(s) ,
  3. Para hide/visible particular, el método de uso de JPanel o JComponent es setVisible()

Tengo un panel (con GridLayout ( 0,1 )) incrustado en JFrame.

Según mi requisito:

  • Estoy agregando (JButton, JTextArea) en pares en el panel declarado anteriormente.
  • Ahora, al hacer clic en JButton de cualquier par, se debe eliminar JTextArea, y al volver a unir JButton, se debe agregar JTextArea nuevamente.

Todo funciona bien, excepto por debajo de dos problemas enumerados:

  1. Las dimensiones de JButton se cambian en la revalidación.
  2. Las dimensiones iniciales de JButton son muy grandes (Cómo restringir la dimensión de JButton)

Como referencia, eche un vistazo a esto .

Y encuentre a continuación los listados de códigos modificados: -

TestFrame.java

package com.test; import java.awt.BorderLayout; import java.awt.Component; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; public class TestFrame extends JFrame implements ActionListener{ final JPanel panel ; private TestFrame() { setExtendedState(JFrame.MAXIMIZED_BOTH) ; setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) ; panel = new JPanel() ; panel.setLayout( new GridLayout(0, 1) ) ; for(int i = 1 ; i <= 3 ; ++i){ TButton btn = new TButton("User " + i + " [Toggle Button for TextArea " + i + "] (Click)") ; panel.add(btn) ; btn.addActionListener(this) ; panel.add(new JScrollPane(btn.getLoggingArea())) ; } add(panel, BorderLayout.CENTER) ; setVisible(true) ; setExtendedState(JFrame.MAXIMIZED_BOTH) ; } @Override public void actionPerformed(ActionEvent e) { TButton btn = (TButton) e.getSource() ; JPanel parent = (JPanel) btn.getParent() ; int index = getIndex(parent, btn) ; if(btn.isLoggingAreaVisible()){ parent.remove( parent.getComponent(index + 1) ) ; btn.setLoggingAreaVisible(false) ; }else{ parent.add(new JScrollPane(btn.getLoggingArea()), index + 1) ; btn.setLoggingAreaVisible(true) ; } parent.revalidate() ; parent.repaint() ; } private int getIndex(JComponent parent, Component btn) { Component []comps = parent.getComponents() ; for(int i = 0 ; i < comps.length ; ++i){ if( comps[i].equals(btn) ){ return i ; } } return -1 ; } public static void main(String[] args) { new TestFrame() ; } }

TButton.java

package com.test; import javax.swing.JButton; import javax.swing.JTextArea; public class TButton extends JButton{ private JTextArea loggingArea ; private boolean loggingAreaVisible = true ; public TButton(String threadName) { super(threadName) ; initComponents(threadName) ; } public void initComponents(String threadName) { String str = "1. By default large buttons are displayed." + "/n" + " But, I want buttons with a little small dimensions." + "/n/n" + "2. On click of above button, above button expands to cover space used by this textArea." + "/n" + " But, what I want, that button size does not changes onClick, only textArea length increases/decreases." ; loggingArea = new JTextArea(getText() + " textArea." + "/n/n" + str + "/n/n" + "Type Here...") ; } public boolean isLoggingAreaVisible() { return loggingAreaVisible; } public void setLoggingAreaVisible(boolean loggingAreaVisible) { this.loggingAreaVisible = loggingAreaVisible; } public JTextArea getLoggingArea() { return loggingArea; } }

Gracias, Rits :)


Deberías usar otro diseño. GridLayout dibuja los componentes al tamaño máximo disponible.


Utilice, por ejemplo, BoxLayout vertical en lugar de GridLayout