java - una - Cómo restringir JButton para cambiar sus dimensiones como resultado de la revalidación
evento cambiar tamaño ventana java (3)
- Devuelve
JPanel
(BorderLayout
) anidado-
JPanel
(tiene por defectoFlowLayout
) paraJButton
, esteJPanel
puesto enBorderLayout.NORTH
-
JTextArea
puesto a continuaciónBorderLayout.CENTER
-
- No puedo ver motivo para
revalidate & repaint
, solo en el caso de que cambie entreJComponents
o elimine y luego agregue nuevosJComponent(s)
, - Para
hide/visible
particular, el método de uso deJPanel
oJComponent
essetVisible()
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:
- Las dimensiones de JButton se cambian en la revalidación.
- 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