Announcement

Collapse
No announcement yet.

JTable erzeugen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • JTable erzeugen

    Ich habe mal versucht ein Tabelle in den Code einzufügen.
    Interessanterweise wird die JScrollPane nicht angezeigt und auch die Kopfzeilen der Tabelle sind nicht sichtbar...!

    Das Beispiel für die Tabelle stammt aus dem Java Buch von Galileo unter 15.25:
    http://openbook.galileodesign.de/jav...nsel15_024.htm

    Code:
    @SuppressWarnings("unchecked")
        private void initComponents() {
        
    	String[][] rowData = {
    		    { "Japan", "245" }, { "USA", "240" }, { "Italien", "220" },
    		    { "Spanien", "217" }, {"Türkei", "215"} ,{ "England", "214" },
    		    { "Frankreich", "190" }, {"Griechenland", "185" },
    		    { "Deutschland", "180" }, {"Portugal", "170" }
    		  };
    		    String[] columnNames = {
    		        "Land", "Durchschnittliche Sehdauer pro Tag in Minuten"
    		    };
    		    
    	jButton1 = new JButton();
        jButton2 = new JButton();
        jTextField1 = new JTextField();
        jTextArea1 = new JTextArea();
        jScrollPane1 = new JScrollPane(jTable1);
        jTable1 = new JTable( rowData, columnNames );
     
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            getContentPane().setLayout(null);
     
            jButton1.setText("jButton1");
            jButton1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton1ActionPerformed(evt);
                }
            });
            getContentPane().add(jButton1);
            jButton1.setBounds(10, 10, 79, 25);
            
            jButton2.setText("jButton2");
            jButton2.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton1ActionPerformed(evt);
                }
            });
            getContentPane().add(jButton2);
            jButton2.setBounds(10, 40, 79, 25);
            
     
            jTextField1.setText("jTextField1");
            getContentPane().add(jTextField1);
            jTextField1.setBounds(100, 10, 280, 22);
            
            getContentPane().add(jTextArea1);
            jTextArea1.setText("TextArea1");
            jTextArea1.setBounds(100, 40, 400, 50);
            
            getContentPane().add(jTable1);
            jTable1.setPreferredScrollableViewportSize(new Dimension(400, 100));
            jTable1.setBounds(100, 150, 400, 100);
            jTable1.setFillsViewportHeight(true);
            
            add(jScrollPane1);
           
            
     
            java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
            setBounds((screenSize.width-618)/2, (screenSize.height-341)/2, 618, 341);
        }
    Zuletzt editiert von Einklang.; 05.06.2012, 04:12.

  • #2
    Das Beispiel für die Tabelle stammt aus dem Java Buch von Galileo unter 15.25:
    Nein, das steht da so nicht da. Die Tabelle gehört in die Scrollpane und die Scollpane in den Frame. Du packst beides getrennt voneinander in den Frame. Die JTable bekommt KEINE Größendaten, die Scrollpane HAT bei dir keine Größendaten



    public class NewJFrame extends javax.swing.JFrame {
    private DefaultTableModel defaultTableModel=null;
    private JScrollPane jScrollPane1;
    private JTable jTable1;


    public NewJFrame() {
    initComponents();
    defaultTableModel=(DefaultTableModel) jTable1.getModel();
    }

    @SuppressWarnings("unchecked")
    private void initComponents() {

    jScrollPane1 = new JScrollPane();
    jTable1 = new JTable();

    setDefaultCloseOperation(WindowConstants.EXIT_ON_C LOSE);
    getContentPane().setLayout(null);

    jTable1.setModel(new DefaultTableModel(
    new Object [][] {
    {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"
    }
    ));
    jScrollPane1.setViewportView(jTable1);

    getContentPane().add(jScrollPane1);
    jScrollPane1.setBounds(0, 0, 390, 280);

    pack();
    }

    public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
    new NewJFrame().setVisible(true);
    }
    });
    }


    }

    Zuletzt editiert von Christian Marquardt; 11.03.2020, 12:36.
    Christian

    Comment


    • #3
      Ha super besten Dank!

      Der Knackpunkt warum es nicht angezeigt wurde war wohl

      Code:
      jScrollPane1.setViewportView(jTable1);
      Hier steht in dem Tooltipp dass ein "add" nicht genommen werden soll/darf...!
      Auch wenn ich zusätzlich die jTable1 direkt zur contenPane einfüge wird alles richtig angezeigt - auch wenns wohl unschön programmiert/überflüssig ist funktionierts...!

      Ok besten Dank jetzt muss ich damit herumspielen und ausprobieren :-)

      Freu mich wirklich über soviel Unterstützung und Hilfe...

      Comment


      • #4
        Hier steht in dem Tooltipp dass ein "add" nicht genommen werden soll/darf...!
        Das ist falsch
        Christian

        Comment


        • #5
          Hm im Tooltipp steht:

          Applications should not add children directly to the scrollpane.
          Auch hier zu lesen: http://docs.oracle.com/javase/7/docs/api/ unter JScrollPane und dort dann unter setViewportView.....!

          Naja es schien auf jeden Fall der Fehler zu sein, aber ich probier noch weiter aus!

          Comment


          • #6
            Von welchem ADD reden wir?

            Ich binde das Element genau über

            jScrollPane1.setViewportView(jTable1);

            ein

            Christian

            Comment


            • #7
              Genau und das fehlt mir ja.... ich habe hier mit "add" immer rumprobiert....!

              Comment


              • #8
                Achso, dachte die Adds um Komponenten der Pane zuzufügen
                Christian

                Comment


                • #9
                  Zu dem DefaultTableModel - das Prinzip hab ich ja verstanden, aber wo wird das noch genauer erklärt vielleicht?

                  Was kann ich damit machen alles, was für Paramter sind hier möglich odern ötig usw?
                  Beispielsweise sind die Überschriften noch mit der Standard-Hintergrundfarbe zu sehen....!

                  Ich hab in der API Dokumentation jetzt nichts gefunden....! Wie bekomm ich sowas immer heraus und kann mir die Informationen selbst erschließen?

                  Danke

                  Comment


                  • #10
                    Das TabelModel ist einzig für die Daten zuständig. Was der kann, steht in der API

                    Wenn du das Aussehen der Zellen ändern willst ist eine eigene CellRender Klasse zu schreiben. In dieser kann das Aussehen geändert werden. Ein CellRenderer kann es für die Headerzellen geben und für die normalen Zellen
                    Hier ein Header-CellRenderer der beispielsweise die Ausrichtung des Textes in der Zelle ändert
                    [highlight=java]
                    public class AlignTableHeaderRenderer extends DefaultTableCellRenderer
                    {
                    private int align=SwingConstants.CENTER;
                    private Color foregroundColor=Color.BLACK;
                    private int fontstyle=Font.PLAIN;

                    public AlignTableHeaderRenderer()
                    {
                    }

                    public AlignTableHeaderRenderer(int align)
                    {
                    this.align=align;
                    }

                    public AlignTableHeaderRenderer(int align,int fontstyle,Color foregroundcolor)
                    {
                    this.align=align;
                    this.fontstyle=fontstyle;
                    this.foregroundColor=foregroundcolor;
                    }

                    public void setForegroundColor(Color foregroundColor)
                    {
                    this.foregroundColor=foregroundColor;
                    }

                    public void setFontstyle(int fontstyle)
                    {
                    this.fontstyle=fontstyle;
                    }

                    @Override
                    public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int column)
                    {
                    TableCellRenderer renderer=table.getTableHeader().getDefaultRenderer ();
                    JLabel label=(JLabel)renderer.getTableCellRendererCompone nt(table,value,isSelected,hasFocus,row,column);
                    label.setHorizontalAlignment(align);
                    label.setForeground(foregroundColor);
                    label.setFont(label.getFont().deriveFont(fontstyle ));
                    return label;
                    }

                    }

                    [/highlight]

                    Um diese in der Spalte 1 einzubinden ist folgender Code erforderlich

                    JTable1.getColumnModel().getColumn(0).setHeaderRen derer(new AlignTableHeaderRenderer(SwingConstants.CENTER,Fon t.BOLD,Color.BLACK));

                    Dann wird der Text in der ersten Spalte in der Mitte, fett und schwarz dargestellt
                    Christian

                    Comment

                    Working...
                    X