2016-04-06 7 views
1

Weder JTable zeigt Spaltennamen als Titel, noch habe ich scrollBar, wenn ich Daten manuell hinzufüge.JTable in Eclipse zeigt keine Spaltennamen an

Code für JTable und JScrollPane:

private JPanel contentPane = new JPanel(); 
    Object[] title = {"ISBN", "Name", "Author", "Shelf No", "Row No", "Col No"}; 
    DefaultTableModel dtm = new DefaultTableModel(); 
    dtm.setColumnIdentifiers(title); 
    table = new JTable(dtm); 
    table.setBounds(23, 55, 435, 217); 
    table.setModel(dtm); 
    JScrollPane scroll = new JScrollPane(table, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    table.setForeground(Color.gray); 
    table.setRowHeight(30); 
    contentPane.add(scroll); 
    contentPane.add(table); 
    Object[] row = {"hi", "2", "3", "5", "r", "we" }; 

Action hinzufügen Daten in der Tabelle:

btnSearch.addActionListener(
      new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 

        dtm.addRow(row); 

       } 
      }); 

Wie Sie unten in Bild sehen können, habe ich nicht die Spalten (Titel) und Scrollleiste.

picture

+0

Bitte posten Sie Ihre vollständigen Code. –

+0

@vishalgajerahere ist mein Wettbewerb Code: http://pastebin.com/xcC42H7k – nix

+0

siehe geschriebene Antwort, wo Sie vollständigen laufenden Code mit output finden können. Viel Glück!! –

Antwort

1

Sie folgende Änderungen in den Code,

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import com.my.classes.Validation; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.border.EmptyBorder; 
import javax.swing.table.DefaultTableModel; 

public class SearchBooks extends JFrame { 

    private JPanel contentPane; 
    private JTextField txtIsbn; 
    private Validation v = new Validation(); 
    private JTable table; 
    DefaultTableModel dtm ; 
    Object[] row = {"hi", "2", "3", "5", "r", "we" }; 


    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        SearchBooks frame = new SearchBooks(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public SearchBooks() { 
     setTitle("Search Books from Database"); 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     //setBounds(100, 100, 502, 341); instead of it use pack() see below it's uses at right place not here... 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     //contentPane.setLayout(null); 

     JLabel lblBookName = new JLabel("Book Name: "); 
     lblBookName.setFont(new Font("Tahoma", Font.BOLD, 11)); 
     lblBookName.setBounds(23, 11, 80, 14); 
     contentPane.add(lblBookName); 

     txtIsbn = new JTextField(); 
     txtIsbn.setBounds(113, 8, 202, 20); 
     contentPane.add(txtIsbn); 
     txtIsbn.setColumns(10); 

     JButton btnSearch = new JButton("Search"); 
     btnSearch.setFont(new Font("Tahoma", Font.BOLD, 11)); 
     btnSearch.setBounds(338, 7, 103, 23); 
     contentPane.add(btnSearch); 

     Object[] title = {"ISBN", "Name", "Author", "Shelf No", "Row No", "Col No"}; 
     dtm = new DefaultTableModel(); 
     dtm.setColumnIdentifiers(title); 
     table = new JTable(dtm); 
     table.setBounds(23, 55, 435, 217); 
     table.setModel(dtm); 
     //JScrollPane scroll = new JScrollPane(table, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     JScrollPane scroll = new JScrollPane(table); 
     table.setFillsViewportHeight(true); 
     table.setForeground(Color.RED); 
     table.setRowHeight(30); 
     contentPane.add(scroll); 

     // contentPane.add(table); //comment it... 

     //dtm.addRow(title); doesn't required because already header is there... 
     pack(); 

     txtIsbn.addKeyListener(
       new KeyAdapter() { 
        public void keyPressed(KeyEvent ev) { 
         if(ev.getKeyCode() == KeyEvent.VK_ENTER) { 

          if(v.validateIsbn(txtIsbn.getText()) || v.validateAddress(txtIsbn.getText())) { 

          }else { 
           JOptionPane.showMessageDialog(null, "Error! Please check your input"); 
          } 
         } 
        } 
       }); 

     btnSearch.addActionListener(
       new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         table.setForeground(Color.BLACK); 
         dtm.addRow(row); 

        } 
       }); 
    } 
} 

Otu-Put:

enter image description here

+0

danke. es ist gelöst. kannst du bitte erklären, warum wir 'contentPane.setLayout() 'auskommentiert haben. – nix

1

Sie fügen nicht Ihre JTable zum scrollpane aber auf Ihre contentpane. Versuchen Sie stattdessen:

contentPane.add(scroll); 
scroll.add(table); //instead of contentPane.add(table) 
+0

hat es nicht funktioniert. hier ist mein Wettbewerb Code: http://pastebin.com/xcC42H7k – nix

1

Die JTable Spaltenüberschriften sind displayed im JScrollPane, so ist dies richtig:

contentPane.add(scroll); 

Sie nicht sofort dann das Scroll-Scheibe mit der Tabelle ersetzen:

//contentPane.add(table); 

Anstatt setBounds(), überschreiben Sie getPreferredScrollableViewportSize(), wie vorgeschlagen here. Da das Standardlayout von JPanelFlowLayout ist, bleibt die Tabelle eine feste Größe. Betrachten Sie GridLayout, wodurch die Anzeige Änderungen an der Größe des umschließenden Rahmens anzeigen kann.

JPanel contentPane = new JPanel(new GridLayout()); 
+0

es hat nicht funktioniert. Hier ist mein vollständiger Code für diese Klasse: http://pastebin.com/xcC42H7k – nix