2017-10-10 3 views
1

Ich versuche JTable innerhalb JScrollPane zu setzen. JScrollPane ist innerhalb JPanel das ist der Teil von JTabbedPane. HierJTable zu JScrollPane in JTabbedPane hinzufügen

ist der 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); 

Als ich dies ausführen, wird table nicht angezeigt. Wenn ich ein:

pnlMaxMinAvg1.add(table); 

dann ist table sichtbar.

Warum?

Antwort

1

Ihre JPanel, pnlMaxMinAvg1, ist leer, wenn Sie es in die Ansichtsfensteransicht von scrollPane machen. Durch Hinzufügen der table zu pnlMaxMinAvg1 wird dem Bildlauffeld ein nicht leerer Inhalt zur Anzeige hinzugefügt. Vermeiden Sie außerdem setBounds() und lassen Sie das Layout die Arbeit machen. Im Beispiel unten wird die Ansicht des Bildlauffensters wie in Ihrem Fragment explizit auf die Tabelle gesetzt, Sie können sie jedoch im Konstruktor des Bildlauffensters angeben.

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); 
    } 
} 

In dieser Variante habe ich N Reihen von Daten und Überschreiben der Scrollable Methode getPreferredScrollableViewportSize(), zugegeben als here gezeigt. Verändern Sie die Größe des umschließenden Fensters, um zu sehen, wie es sich auf die Bildlaufleiste auswirkt.

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); 
    } 
}