2017-10-10 8 views
1

J'essaie de mettre JTable à l'intérieur JScrollPane. JScrollPane est à l'intérieur JPanel qui est la partie de JTabbedPane.Ajout de JTable à JScrollPane à l'intérieur de JTabbedPane

Voici le code:

JScrollPane scrollPane = new JScrollPane(); 
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);    

    JPanel pnlMaxMinAvg1 = new JPanel(); 
    scrollPane.setViewportView(pnlMaxMinAvg1); 
    tabbedPane.addTab("MaxMinAvg1", null, pnlMaxMinAvg1, null); 
    pnlMaxMinAvg1.setLayout(new BorderLayout(0,0)); 

table = new JTable(); 
     table.setModel(new DefaultTableModel(
      new Object[][] {{"V_L1_N_RMS_AVG", null} 
}, 
      new String[] { 
       "Variable", "Value" 
      } 
     )); 
     table.setBounds(178, 11, 200,300); 

scrollPane.add(table); 

Quand je lance ce, table n'est pas affiché. Si je mets:

pnlMaxMinAvg1.add(table); 

puis table est visible.

Pourquoi?

Répondre

1

Votre JPanel, pnlMaxMinAvg1 est vide au moment de la création de la vue de scrollPane. L'ajout de table à pnlMaxMinAvg1 donne au volet de défilement du contenu non vide à afficher. De plus, évitez setBounds() et laissez la mise en page faire le travail. Dans l'exemple ci-dessous, la vue du volet défilant est définie explicitement sur la table, comme dans votre fragment, mais vous pouvez le spécifier dans le constructeur du volet de défilement.

image

import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTabbedPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 

/** 
* @see https://stackoverflow.com/q/46669145/230513 
*/ 
public class TableTest { 

    private void display() { 
     JFrame f = new JFrame("TableTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JTable table = new JTable(); 
     table.setModel(new DefaultTableModel(
      new Object[][]{{"V_L1_N_RMS_AVG", null}}, 
      new String[]{"Variable", "Value"} 
     )); 
     JScrollPane jsp = new JScrollPane(); 
     jsp.setViewportView(table); 
     JTabbedPane jtp = new JTabbedPane(); 
     jtp.add("TableTest", jsp); 
     f.add(jtp); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new TableTest()::display); 
    } 
} 

Dans cette variante, j'ai ajouté N lignes de données et réécrite la méthode Scrollable, getPreferredScrollableViewportSize(), comme le montre here. Redimensionnez la fenêtre englobante pour voir comment elle affecte la barre de défilement.

image2

import java.awt.Dimension; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTabbedPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 

/** 
* @see https://stackoverflow.com/q/46669145/230513 
*/ 
public class TableTest { 

    private static final int N = 16; 

    private void display() { 
     JFrame f = new JFrame("TableTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     DefaultTableModel model = new DefaultTableModel(
      null, new String[]{"Variable", "Value"} 
     ); 
     JTable table = new JTable(model) { 

      @Override 
      public Dimension getPreferredScrollableViewportSize() { 
       return new Dimension(256, getRowHeight() * N/2); 
      } 
     }; 
     for (int i = 0; i < N; i++) { 
      model.addRow(new Object[]{"V_L1_N_RMS_AVG" + i, String.valueOf(i)}); 
     } 
     JScrollPane jsp = new JScrollPane(); 
     jsp.setViewportView(table); 
     JTabbedPane jtp = new JTabbedPane(); 
     jtp.add("TableTest", jsp); 
     f.add(jtp); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new TableTest()::display); 
    } 
}