java - 为什么我的 JTable 没有出现?

标签 java swing layout jtable

我正在制作一个随机应用程序,我希望它为电子表格制作表格。到目前为止我已经编写了一些代码,但我的 JTable 似乎没有显示出来。我做错了什么?这是我的代码:

import java.awt.EventQueue;
import java.awt.*;
import javax.swing.*;

public class Screen {

private static JFrame frame;
public JFileChooser choicer = new JFileChooser();
public Font f = new Font("Candara", Font.PLAIN, 16);
public TableMethods tm = new TableMethods();
String dir;
JTable Table;
String[] columns;
String[][] data;
JScrollPane jsp;
/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Screen window = new Screen();
                window.frame.setVisible(true);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public Screen() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setTitle("Spreadr");
    frame.setBounds(100, 100, 1000, 800);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


    JMenuBar menuBar = new JMenuBar();
    frame.setJMenuBar(menuBar);

    JMenu FileMenu = new JMenu("File");
    FileMenu.setFont(f);
    menuBar.add(FileMenu);

    JMenuItem New_Doc = new JMenuItem("New Document");
    New_Doc.setFont(f);
    New_Doc.addActionListener(e -> {
        choicer.setCurrentDirectory(new java.io.File("."));
        choicer.setDialogTitle("New Document");
        choicer.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        choicer.setAcceptAllFileFilterUsed(false);

        if (choicer.showOpenDialog(new JPanel()) == JFileChooser.APPROVE_OPTION) {
            dir = String.valueOf(choicer.getCurrentDirectory());
        }
    });
    FileMenu.add(New_Doc);

    JMenuItem Save_Doc = new JMenuItem("Save Document");
    Save_Doc.setFont(f);
    FileMenu.add(Save_Doc);

    JMenuItem Open_Doc = new JMenuItem("Open Document");
    Open_Doc.setFont(f);
    FileMenu.add(Open_Doc);

    JMenu EditMenu = new JMenu("Edit");
    EditMenu.setFont(f);
    menuBar.add(EditMenu);

    JMenuItem Copy = new JMenuItem("Copy");
    Copy.setFont(f);
    EditMenu.add(Copy);

    JMenuItem Cut = new JMenuItem("Cut");
    Cut.setFont(f);
    EditMenu.add(Cut);

    JMenuItem Paste = new JMenuItem("Paste");
    Paste.setFont(f);
    EditMenu.add(Paste);
    EditMenu.addSeparator();

    JMenuItem EditRows = new JMenuItem("Edit Rows...");
    EditRows.setFont(f);
    JMenuItem EditColumns = new JMenuItem("Edit Columns...");
    EditColumns.setFont(f);

    EditMenu.add(EditColumns);
    EditMenu.add(EditRows);
    frame.getContentPane().setLayout(new BorderLayout(0, 0));

    Table = new JTable();
    Table = tm.newTable(Table);
    jsp = new JScrollPane(Table);
    frame.add(jsp);
}

class TableMethods {
    public JTable newTable(JTable table) {
        int i = 1;
        columns = new String[10];
        while (i <= 10) {
            columns[i - 1] = String.valueOf(i);
        }

        i = 0;
        int j = 0;
        while (i < 10) {
            while (j < 2) {
                data[i][j] = String.valueOf(i + j);
                j++;
            }
            i++;
        }
        table = new JTable(data, columns);
        table.setFillsViewportHeight(false);
        table.setDragEnabled(false);
        frame.getContentPane().add(table);
        return table;
    }
}
}

我觉得我的布局有问题。我按照 @ClarkKent 的要求做了一些更改,但现在应用程序完全是白色的。

The White App

最佳答案

发现几个问题。屏幕不会显示,因为您从未增加 i,也从未在 newTable 方法中初始化数据。这会产生无限循环,导致您的屏幕尚不可见。修复无限循环后,您将得到一个空指针异常。

import java.awt.EventQueue;
import java.awt.*;
import javax.swing.*;

public class Screen {

    private JFrame frame;
    public JFileChooser choicer = new JFileChooser();
    public Font f = new Font("Candara", Font.PLAIN, 16);
    public TableMethods tm = new TableMethods();
    String dir;
    JTable Table;
    String[] columns;
    String[][] data;
    JScrollPane jsp;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Screen window = new Screen();
                    //window.frame.setVisible(true);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Screen() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setTitle("Spreadr");
        frame.setBounds(100, 100, 1000, 800);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JMenuBar menuBar = new JMenuBar();
        frame.setJMenuBar(menuBar);

        JMenu FileMenu = new JMenu("File");
        FileMenu.setFont(f);
        menuBar.add(FileMenu);

        JMenuItem New_Doc = new JMenuItem("New Document");
        New_Doc.setFont(f);
        New_Doc.addActionListener(e -> {
            choicer.setCurrentDirectory(new java.io.File("."));
            choicer.setDialogTitle("New Document");
            choicer.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            choicer.setAcceptAllFileFilterUsed(false);

            if (choicer.showOpenDialog(new JPanel()) == JFileChooser.APPROVE_OPTION) {
                dir = String.valueOf(choicer.getCurrentDirectory());
            }
        });
        FileMenu.add(New_Doc);

        JMenuItem Save_Doc = new JMenuItem("Save Document");
        Save_Doc.setFont(f);
        FileMenu.add(Save_Doc);

        JMenuItem Open_Doc = new JMenuItem("Open Document");
        Open_Doc.setFont(f);
        FileMenu.add(Open_Doc);

        JMenu EditMenu = new JMenu("Edit");
        EditMenu.setFont(f);
        menuBar.add(EditMenu);

        JMenuItem Copy = new JMenuItem("Copy");
        Copy.setFont(f);
        EditMenu.add(Copy);

        JMenuItem Cut = new JMenuItem("Cut");
        Cut.setFont(f);
        EditMenu.add(Cut);

        JMenuItem Paste = new JMenuItem("Paste");
        Paste.setFont(f);
        EditMenu.add(Paste);
        EditMenu.addSeparator();

        JMenuItem EditRows = new JMenuItem("Edit Rows...");
        EditRows.setFont(f);
        JMenuItem EditColumns = new JMenuItem("Edit Columns...");
        EditColumns.setFont(f);

        EditMenu.add(EditColumns);
        EditMenu.add(EditRows);
        frame.getContentPane().setLayout(new BorderLayout(0, 0));

        Table = new JTable();
        Table = tm.newTable(Table);
        jsp = new JScrollPane(Table);
        frame.add(jsp);
        frame.pack();
        frame.setVisible(true);
    }

    class TableMethods {
        public JTable newTable(JTable table) {
            int i = 1;
            columns = new String[10];
            while (i <= 10) {
                columns[i++ - 1] = String.valueOf(i); //Increment i
            }
            data = new String[10][10]; //Initialize data.
            i = 0;
            int j = 0;
            while (i < 10) {
                j=0;  //Set j to 0.
                while (j < 2) {
                    data[i][j] = String.valueOf(i + j);
                    j++;
                }
                i++;
            }
            table = new JTable(data, columns);
            table.setFillsViewportHeight(false);
            table.setDragEnabled(false);
            frame.getContentPane().add(table);
            return table;
        }
    }
}

enter image description here

关于java - 为什么我的 JTable 没有出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37551678/

相关文章:

Java JPanel 自己稍微移动 + 额外

switch 语句的 Java 扩展枚举

java - 如何避免 JFileChooser.setFileFilter() 调用中的 ConcurrentModificationException?

css - Fieldset不支持显示: table/table-cell

java - Synth - 将背景设置为 JFrame

java - 无法向位于其他类的 `paintComponent()` 方法提供鼠标坐标

java - 如何在java中呈现简单的警报消息?

java - FlowLayout.CENTER 未使组件居中

swift - 如何在单元格之间获得更均匀的垂直距离?

java - 使用 netbeans 创建的 JFrame 在设计窗口中看起来不错,但在我运行它时却一团糟