Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Hacer invisible una jTable

Buenas tengo una tabla que se llama jtable1 y lo que quiero es hacerla invisible.
Y usado el sig codigo: jtable1.setVisible(false);
Pero lo que pasa es que desaparecen las celdas de la tabla no la tabla en si.
¿Sabeis como hacerla invisible totalmente?

mayo 16, 2014 | Unregistered CommenterChoke

Saludos..

Bueno cuando se usa un Jtable esto se crea dentro de un JScrollPane, por ende si necesitas que no se muestra ni si quiera el contorno del Jtable, lo que debes poner como setVisible(false) debería ser el JScrollPane.

mayo 16, 2014 | Unregistered CommenterDavid

Puedes usar un método como el que sigue:

public void setTableVisible(JTable table, boolean isVisible) {
table.setVisible(isVisible);
table.getTableHeader().setVisible(isVisible);
}

mayo 16, 2014 | Registered Commenterchoces

@David

No es frecuente, pero pueden crearse JTable sin JScrollPane, por eso es mejor usar métodos propios de JTable; aunque, evidentemente, tu solución funciona perfectamente si se usa una JTable dentro de un JScrollPane.

Otra cuestión es que si se quiere usar, con tu método, la invisibilidad en un helper, es inevitable acceder al JScrollPane, o pasarlo como parámetro a un método como el anterior, y verificar si existe el tal ScrollPane.

mayo 16, 2014 | Registered Commenterchoces

Un método para obtener el JScrollPane de una JTable. Devolverá null si el JScrollPane no existe.

public JScrollPane getScrollPane(JTable table) {
JScrollPane scrollPane = null;
final Container parent = SwingUtilities.getUnwrappedParent(table);
if (parent instanceof JViewport) {
final Container container = parent.getParent();
if (container instanceof JScrollPane) {
scrollPane = (JScrollPane) container;
}
}
return scrollPane;
}

mayo 16, 2014 | Registered Commenterchoces

Gracias, os comento a los lados de la tabla tengo una serie de botones y cuando hago invisible la tabla los botones de la derecha se me mueven hay alguna manera de que se queden estáticos os botones?

mayo 20, 2014 | Unregistered CommenterChoke

Si el layout de los componentes es relativo al JScrollPane, y haces éste invisible, se pierde la referencia del layout.
Es otra de las razones para usar los métodos de visibilidad de la JTable.

En el test que sigue, la tabla se oculta al inicio, y las barras del JScrollPane se activan o desactivan, dependiendo de la visibilidad de la JTable; sin embargo, la posición de los botones no cambia.


import java.awt.Container;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;

public class NewJFrame extends javax.swing.JFrame {

private static final long serialVersionUID = 8_467_753_849_880_501_107L;

/** Creates new form NewJFrame */
public NewJFrame() {
initComponents();
setTableVisible(jTable2, false);
}

public void setTableVisible(JTable table, boolean isVisible) {
table.setVisible(isVisible);
table.getTableHeader().setVisible(isVisible);
jScrollPane2.setVerticalScrollBarPolicy(isVisible ? ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED : ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
jScrollPane2.setHorizontalScrollBarPolicy(isVisible ? ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED : ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
}

public JScrollPane getScrollPane(JTable table) {
JScrollPane scrollPane = null;
final Container parent = SwingUtilities.getUnwrappedParent(table);
if (parent instanceof JViewport) {
final Container container = parent.getParent();
if (container instanceof JScrollPane) {
scrollPane = (JScrollPane) container;
}
}
return scrollPane;
}

/** This method is called from within the constructor to
initialize the form.
WARNING: Do NOT modify this code. The content of this method is
always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

jPanel1 = new javax.swing.JPanel();
jScrollPane2 = new javax.swing.JScrollPane();
jTable2 = new javax.swing.JTable();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jScrollPane2.setBorder(null);

jTable2.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null}
},
new String [] {
"Title 1", "Title 2", "Title 3", "Title 4"
}
));
jScrollPane2.setViewportView(jTable2);

jButton1.setText("jButton1");

jButton2.setText("jButton2");

javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jButton1)
.addComponent(jButton2))
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(jButton2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton1))
.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap())
);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
);

pack();
}// </editor-fold>

/**
@param args the command line arguments
*/
public static void main(String args[]) {

/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new NewJFrame().setVisible(true);
}
});
}

// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTable jTable2;
// End of variables declaration
}

mayo 20, 2014 | Registered Commenterchoces

Si cambias el constructor de la clase por el siguiente, verás cómo se vuelve visible e invisible, cada 5 segundos.

public NewJFrame() {
initComponents();
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new Runnable() {
private boolean condicion;

@Override
public void run() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
setTableVisible(jTable2, condicion);
condicion = !condicion;
}
});
}
}, 0, 5, TimeUnit.SECONDS);

}

mayo 20, 2014 | Registered Commenterchoces