Java JPanel中的表位于选项卡中时出错

Java JPanel中的表位于选项卡中时出错,java,swing,exception,Java,Swing,Exception,我真的不知道该问什么,但要发布代码并把错误信息放在这里。该程序应创建一个包含两个选项卡的窗口,并在每个选项卡中创建一个分数表 package components; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.JTextPane; public class TopLevelDemo extends JPanel{ public TopLevelDemo() {

我真的不知道该问什么,但要发布代码并把错误信息放在这里。该程序应创建一个包含两个选项卡的窗口,并在每个选项卡中创建一个分数表

package components;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JTextPane;

public class TopLevelDemo extends JPanel{
    public TopLevelDemo() {
        JTabbedPane tabbedPane = new JTabbedPane();
        String[] players = new String[4];
        Object[][] singlesScores = new Object[2][4];
        Object[][] doublesScores = new Object[2][4];
        createScores(singlesScores);
        createScores(doublesScores);

        JComponent panel1 = makeScoreTable(singlesScores, players, 0, 0);
        tabbedPane.addTab("Singles",panel1);
        tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);

        JComponent panel2 = makeScoreTable(doublesScores, players, 0, 0);
        tabbedPane.addTab("Doubles", panel2);
        tabbedPane.setMnemonicAt(1, KeyEvent.VK_2);

        add(tabbedPane);
        tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
    }
    protected JComponent makeScoreTable(Object[][] scores, String[] players, int x, int y) {
        JPanel panel = new JPanel(true);
        JTable table = new JTable(scores, players);
        GridBagConstraints c = new GridBagConstraints();
        c.gridx=x;
        c.gridy=y;
        panel.add(table, c);
        return panel;
    }
    protected JComponent makeTextPanel(String text) {
        JPanel panel = new JPanel(true);
        JLabel filler = new JLabel(text);
        filler.setHorizontalAlignment(JLabel.CENTER);
        panel.setLayout(new GridLayout(10, 25));
        panel.add(filler);
        return panel;
    }
    private static void createAndShowGUI() {
        JFrame frame = new JFrame("TopLevelDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(new TopLevelDemo(), BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }
     private Object[][] createScores(Object[][] scores) {
        scores[0][0]= new String("Home");
        scores[0][1]= new Integer(0);
        scores[0][2]= new Integer(0);
        scores[0][3]= new Integer(0);
        scores[1][0]= new String("Away");
        scores[0][1]= new Integer(0);
        scores[0][2]= new Integer(0);
        scores[0][3]= new Integer(0);
        return scores;
    }
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                UIManager.put("swing.boldMetal", Boolean.FALSE);
                createAndShowGUI();
            }
        });
    }
}
然后我得到了错误

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at javax.swing.JTable$1.getColumnName(JTable.java:665)
    at javax.swing.JTable.addColumn(JTable.java:2770)
    at javax.swing.JTable.createDefaultColumnsFromModel(JTable.java:1264)
    at javax.swing.JTable.tableChanged(JTable.java:4374)
    at javax.swing.JTable.setModel(JTable.java:3676)
    at javax.swing.JTable.<init>(JTable.java:612)
    at javax.swing.JTable.<init>(JTable.java:553)
    at javax.swing.JTable.<init>(JTable.java:664)
    at components.TopLevelDemo.makeScoreTable(TopLevelDemo.java:30)
    at components.TopLevelDemo.<init>(TopLevelDemo.java:17)
    at components.TopLevelDemo.createAndShowGUI(TopLevelDemo.java:49)
    at components.TopLevelDemo.access$000(TopLevelDemo.java:8)
    at components.TopLevelDemo$1.run(TopLevelDemo.java:68)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:666)
    at java.awt.EventQueue.access$400(EventQueue.java:81)
    at java.awt.EventQueue$2.run(EventQueue.java:627)
    at java.awt.EventQueue$2.run(EventQueue.java:625)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:636)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
线程“AWT-EventQueue-0”java.lang.NullPointerException中的异常 位于javax.swing.JTable$1.getColumnName(JTable.java:665) 位于javax.swing.JTable.addColumn(JTable.java:2770) 在javax.swing.JTable.createDefaultColumnsFromModel(JTable.java:1264)中 在javax.swing.JTable.tableChanged(JTable.java:4374) 位于javax.swing.JTable.setModel(JTable.java:3676) 位于javax.swing.JTable。(JTable.java:612) 位于javax.swing.JTable。(JTable.java:553) 位于javax.swing.JTable。(JTable.java:664) 位于components.TopLevelDemo.makeScoreTable(TopLevelDemo.java:30) 位于components.TopLevelDemo.(TopLevelDemo.java:17) 位于components.TopLevelDemo.createAndShowGUI(TopLevelDemo.java:49) 在components.TopLevelDemo.access$000(TopLevelDemo.java:8) TopLevelDemo$1.run(TopLevelDemo.java:68) 在java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)中 位于java.awt.EventQueue.dispatchEventImpl(EventQueue.java:666) 在java.awt.EventQueue.access$400(EventQueue.java:81) 在java.awt.EventQueue$2.run(EventQueue.java:627) 在java.awt.EventQueue$2.run(EventQueue.java:625) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 位于java.awt.EventQueue.dispatchEvent(EventQueue.java:636) 位于java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 位于java.awt.EventDispatchThread.PumpeEventsforFilter(EventDispatchThread.java:184) 位于java.awt.EventDispatchThread.PumpeEventsforHierarchy(EventDispatchThread.java:174) 位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 在java.awt.EventDispatchThread.run处(EventDispatchThread.java:122)
有人知道我做错了什么或做得不好吗?

当JTable尝试制作列时,你似乎得到了NPE,这可以通过以下事实来解释:

JComponent panel1 = makeScoreTable(singlesScores, players, 0, 0);

players数组中除了空字符串外什么都没有。使它们非空。

您需要为表列名赋值

字符串数组

String[] players = new String[4];
创建一个由2个字符串组成的数组,每个字符串都具有默认值
null
。您可以使用:

String[] players = { "Player 1", "Player 2", "Player 3", "Player 4" };
更新:

JTable
直接添加到评分面板上不允许显示所有客户区。要修复此问题,可以将其放置在
JScrollPane
中:

panel.add(new JScrollPane(table), c);

正如我以前所知道的,列名从未出现过。列名是否仅用于更高级的表实现的参考?客户端区域大小仅由填充的单元格区域确定。要修复此问题,可以将其放置在滚动窗格中。请参阅更新。