【问题标题】:JTable column titles not showing up even though I have a JScrollPane即使我有 JScrollPane,也没有显示 JTable 列标题
【发布时间】:2019-07-15 07:49:57
【问题描述】:

我一直在尝试制作一个简单的游戏,其中一个按钮会弹出一个带有玩家排行榜的窗口,但是在搜索了一段时间并尝试了所有方法之后,我的列标题现在出现了。

我使用的代码是:

package hr.tvz.programiranje.java.windows;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import java.awt.BorderLayout;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import java.awt.Font;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.awt.Color;
import javax.swing.border.MatteBorder;
import javax.swing.table.DefaultTableModel;

public class LeaderboardTable extends JFrame {
    private JFrame frmLeaderboards;
    private JTable leaderboard_table;

    public void show_table_screen() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    frmLeaderboards.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public LeaderboardTable() {
        initialize();
    }

    @SuppressWarnings("serial")
    private void initialize() {
        frmLeaderboards = new JFrame();
        frmLeaderboards.setTitle("Leaderboards");
        frmLeaderboards.setBounds(100, 100, 485, 218);
        frmLeaderboards.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        HashMap<String, Float> leaderboard_map = MainWindow.get_leaderboard_map();
        int map_size = leaderboard_map.size();
        Object[][] data = new Object[map_size][3];

        // Sort the map
        LinkedHashMap<String, Float> sorted = new LinkedHashMap<>();
        leaderboard_map.entrySet()
        .stream()
        .sorted(Map.Entry.comparingByValue())
        .forEachOrdered(x -> sorted.put(x.getKey(), x.getValue()));

        // Write the map data into a matrix
        int i = 0;
        for(String key:sorted.keySet()) {
            data[i][0] = i + 1;
            data[i][1] = key;
            data[i++][2] = sorted.get(key);
        }

        String[] column_names = {
            "Rank",
            "Name",
            "Time"
        };

        leaderboard_table = new JTable(new DefaultTableModel(data, column_names) {
            boolean[] columnEditables = new boolean[] { false, false, false };
            public boolean isCellEditable(int row, int column) {
                return columnEditables[column];
            }
        });

        // ScrollPane
        JScrollPane scrollPane = new JScrollPane(leaderboard_table);
        scrollPane.setBounds(36, 37, 407, 79);
        getContentPane().add(scrollPane);

        leaderboard_table.setFont(new Font("Consolas", Font.PLAIN, 12));
        GroupLayout groupLayout = new GroupLayout(frmLeaderboards.getContentPane());
        groupLayout.setHorizontalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
                .addComponent(leaderboard_table, GroupLayout.DEFAULT_SIZE, 434, Short.MAX_VALUE)
        );
        groupLayout.setVerticalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
                .addComponent(leaderboard_table, GroupLayout.DEFAULT_SIZE, 461, Short.MAX_VALUE)
        );
        frmLeaderboards.getContentPane().setLayout(groupLayout);
    }
}

根据我的阅读,我需要将它附加到 JScrollPane,但这不起作用。我的窗口设计如下:

这就是我不断得到的:

编辑:问题已解决,现在是新代码:

package hr.tvz.programiranje.java.windows;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import java.awt.BorderLayout;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import java.awt.Font;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.awt.Color;
import javax.swing.border.MatteBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.BevelBorder;

public class LeaderboardTable extends JFrame {
    private JFrame frmLeaderboards;
    private JTable leaderboard_table;

    public void show_table_screen() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    frmLeaderboards.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public LeaderboardTable() {
        initialize();
    }

    @SuppressWarnings("serial")
    private void initialize() {
        frmLeaderboards = new JFrame();
        frmLeaderboards.setTitle("Leaderboards");
        frmLeaderboards.setBounds(100, 100, 485, 218);
        frmLeaderboards.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        HashMap<String, Float> leaderboard_map = MainWindow.get_leaderboard_map();
        int map_size = leaderboard_map.size();
        Object[][] data = new Object[map_size][3];

        // Sort the map
        LinkedHashMap<String, Float> sorted = new LinkedHashMap<>();
        leaderboard_map.entrySet()
        .stream()
        .sorted(Map.Entry.comparingByValue())
        .forEachOrdered(x -> sorted.put(x.getKey(), x.getValue()));

        // Write the map data into a matrix
        int i = 0;
        for(String key:sorted.keySet()) {
            data[i][0] = i + 1;
            data[i][1] = key;
            data[i++][2] = sorted.get(key);
        }

        String[] column_names = {
            "Rank",
            "Name",
            "Time"
        };

        leaderboard_table = new JTable(new DefaultTableModel(data, column_names) {
            boolean[] columnEditables = new boolean[] { false, false, false };
            public boolean isCellEditable(int row, int column) {
                return columnEditables[column];
            }
        });

        DefaultTableModel model = getTableModel(data, column_names);
        leaderboard_table.setModel(model);
        leaderboard_table.setFont(new Font("Consolas", Font.PLAIN, 12));

        // ScrollPane
        JScrollPane scrollPane = new JScrollPane(leaderboard_table);
        scrollPane.setBounds(36, 37, 407, 79);
        frmLeaderboards.add(scrollPane);
    }

     @SuppressWarnings("serial")
    private DefaultTableModel getTableModel(Object[][] data, String[] column_names) {
        return new DefaultTableModel(data, column_names) {
            boolean[] columnEditables = new boolean[] { false, false, false };
            public boolean isCellEditable(int row, int column) {
                return columnEditables[column];
            }
        };
    }
}

【问题讨论】:

    标签: java swing user-interface jtable jscrollpane


    【解决方案1】:

    试试这个,也许对你有帮助

    import java.awt.EventQueue;
    import java.awt.Font;
    
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;
    
    public class TableExample extends JFrame {
    
        private JFrame frmLeaderboards;
        private JTable leaderboard_table;
    
        public static void main(String[] args) {
            TableExample leaderboardTable = new TableExample();
            leaderboardTable.show_table_screen();
        }
    
        public void show_table_screen() {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        frmLeaderboards.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        public TableExample() {
            initialize();
        }
    
        @SuppressWarnings("serial")
        private void initialize() {
            frmLeaderboards = new JFrame();
            frmLeaderboards.setTitle("Leaderboards");
            frmLeaderboards.setBounds(100, 100, 485, 218);
            frmLeaderboards.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            Object[][] data = getData();
    
            String[] column_names = {
                "Rank",
                "Name",
                "Time"
            };
    
            leaderboard_table = new JTable(data, column_names);
    
            DefaultTableModel model = getTableModel(data, column_names);
    
            leaderboard_table.setModel(model);
    
            leaderboard_table.setFont(new Font("Consolas", Font.PLAIN, 12));
    
            // ScrollPane
            JScrollPane scrollPane = new JScrollPane(leaderboard_table);
            scrollPane.setBounds(36, 37, 407, 79);
            frmLeaderboards.add(scrollPane);
        }
    
        private DefaultTableModel getTableModel(Object[][] data, String[] column_names) {
            return new DefaultTableModel(data, column_names) {
                    boolean[] columnEditables = new boolean[] { false, false, false };
                    public boolean isCellEditable(int row, int column) {
                        return columnEditables[column];
                    }
                };
        }
    
        private Object[][] getData() {
            return new Object[][] {
                    {"Kathy", "Smith",
                        "Snowboarding", new Integer(5), new Boolean(false)},
                    {"John", "Doe",
                        "Rowing", new Integer(3), new Boolean(true)},
                    {"Sue", "Black",
                        "Knitting", new Integer(2), new Boolean(false)},
                    {"Jane", "White",
                        "Speed reading", new Integer(20), new Boolean(true)},
                    {"Joe", "Brown",
                        "Pool", new Integer(10), new Boolean(false)}
                };
        }
    }
    

    【讨论】:

    • 看起来好像垂直分组搞砸了一切,现在将在原始帖子中发布代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多