JPanel中的JTable未显示

ocr*_*ram 2 java swing jtable layout-manager null-layout-manager

我不明白问题出在哪里.JTable嵌入在嵌入JPanel的JScrollPanel中.该表未显示.任何帮助赞赏.我可能错过了添加一些元素.彻底检查但找不到任何东西.这只是构造函数:

    public TableIssues() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 894, 597);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JPanel patientsPanel = new JPanel();
        patientsPanel.setBounds(6, 152, 882, 417);
        patientsPanel.setLayout(null);

        String[] patientsColumns = {
                "one", 
                "two",
                "three"};
        String[][] tableInput={{"first","second","third"},{"first","second","third"}};

        patientsTable = new JTable(tableInput,patientsColumns);
        JScrollPane scroll = new JScrollPane();
        scroll.setBounds(0, 0, 882, 363);
        scroll.setLayout(null);
        scroll.setViewportView(patientsTable);
        patientsPanel.add(scroll);

        JButton addPatietsButton = new JButton("Add");
        addPatietsButton.setFont(new Font("Lucida Grande", Font.PLAIN, 20));
        addPatietsButton.setBounds(356, 375, 211, 36);

        patientsPanel.add(addPatietsButton);
        contentPane.add(patientsPanel);

    }
Run Code Online (Sandbox Code Playgroud)

Hov*_*els 5

永远不要这样做:

scroll.setLayout(null);
Run Code Online (Sandbox Code Playgroud)

你破坏了JScrollPane的布局,所以它完全丧失了它的功能,从而让自己陷入困境.删除该行.

虽然null布局和setBounds()Swing新手似乎是创建复杂GUI的最简单和最好的方法,但是你创建的Swing GUI越多,你在使用它们时会遇到更严重的困难.当GUI调整大小时,它们不会调整组件的大小,它们是增强或维护的皇室女巫,当它们放置在滚动窗格中时它们会完全失败,当它们在所有平台上观看时或者与原始平台不同的屏幕分辨率时它们看起来很糟糕.

例如,这个GUI

在此输入图像描述

由此代码创建:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class TableIssues2 extends JPanel {
    private static final int GAP = 5;
    private static final String[] COL_NAMES = {"One", "Two", "Three"};
    private DefaultTableModel model = new DefaultTableModel(COL_NAMES, 0);
    private JTable patientsTable = new JTable(model);

    public TableIssues2() {
        JPanel buttonPanel = new JPanel(new GridLayout(1, 0, GAP, GAP));
        buttonPanel.add(new JButton("Add"));
        buttonPanel.add(new JButton("Remove"));
        buttonPanel.add(new JButton("Exit"));

        JPanel bottomPanel = new JPanel();
        bottomPanel.add(buttonPanel);

        for (int i = 0; i < 5; i++) {
            model.addRow(new String[]{"First", "Second", "Third"});
        }
        setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        setLayout(new BorderLayout(GAP, GAP));
        add(new JScrollPane(patientsTable), BorderLayout.CENTER);
        add(bottomPanel, BorderLayout.PAGE_END);
    }

    private static void createAndShowGui() {
        TableIssues2 mainPanel = new TableIssues2();

        JFrame frame = new JFrame("TableIssues2");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)