【问题标题】:JTable in eclipse not showing column nameseclipse中的JTable不显示列名
【发布时间】:2016-04-06 07:58:26
【问题描述】:

当我手动添加数据时,JTable 既没有将列名显示为标题,也没有滚动条。

JTable 和 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" };

ActionListener 在表中添加数据:

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

                    dtm.addRow(row);

                }
            });

如下图所示,我没有那些列(标题)和滚动条。

【问题讨论】:

  • 请发布您的完整代码。
  • @vishalgajerahere 是我的竞争代码:pastebin.com/xcC42H7k
  • 查看发布的答案,您可以在其中找到带有输出的完整运行代码。祝你好运!

标签: java eclipse jtable jscrollpane


【解决方案1】:

对您的代码进行以下更改,

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:

【讨论】:

  • 谢谢。它解决了。你能解释一下为什么我们注释掉了contentPane.setLayout()
【解决方案2】:

您没有将 JTable 添加到滚动窗格,而是添加到 contentpane。试试这个:

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

【讨论】:

    【解决方案3】:

    JScrollPane 中的JTable 列标题是displayed,所以这是正确的:

    contentPane.add(scroll);
    

    不要立即用表格替换滚动窗格:

    //contentPane.add(table);
    

    按照建议的here,覆盖getPreferredScrollableViewportSize(),而不是setBounds()。因为JPanel 的默认布局是FlowLayout,所以表格将保持固定大小。考虑GridLayout,它将允许显示在调整封闭框架大小时反映变化。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2014-04-21
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    相关资源
    最近更新 更多