扩展JTable并在JFrame中显示

时间:2013-05-23 01:58:20

标签: java swing jtable

我的代码仍在进行中,但我的问题是我的JTable扩展的类不会显示在JFrame中。这是我的类,它扩展了JTable。其次,我想知道让我的LotteryTable成为一个全新的课程的设计选择是一个好主意。

首先,我的LotteryDisplay包含JTable,然后通过tableSetup()中的LotteryTable方法对其进行了调整。

public class LotteryTable extends JTable
{
    private final String[] columnNames = {"Powerball Combos", "Odds of Winning", "Payout", "Number of Wins", "Win Frequency"};
    JTable table;

    public LotteryTable()
    {
        DefaultTableModel model = new DefaultTableModel(columnNames, 9);
        table = new JTable(model)
        {
            public Class getColumnClass(int column)
            {
                if(column == 0)
                    return ImageIcon.class;
                else
                    return String.class;
            }
        };

        tableSetup();
        setVisible(true);
    }

    public void tableSetup()
    {
        DefaultTableCellRenderer dtcr = new DefaultTableCellRenderer();
        dtcr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
        table.setDefaultRenderer(String.class, dtcr);

        ImageIcon p = new ImageIcon("Icons/Powerball.png"); //Not important to my problem
        ImageIcon w1p = new ImageIcon("Icons/WhiteplusPowerball.png");
        ImageIcon w2P = new ImageIcon("Icons/2WhitePlusPowerball.png");
        ImageIcon w3P = new ImageIcon("Icons/3WhitePlusPowerball.png");
        ImageIcon w4P = new ImageIcon("Icons/4WhitePlusPowerball.png");
        ImageIcon w5P = new ImageIcon("Icons/5WhitePlusPowerball.png");
        ImageIcon w3 = new ImageIcon("Icons/3White.png");
        ImageIcon w4 = new ImageIcon("Icons/4White.png");
        ImageIcon w5 = new ImageIcon("Icons/5White.png");

        table.setValueAt(p, 0, 0);
        table.setValueAt(w1p, 1, 0);
        table.setValueAt(w2P, 2, 0);
        table.setValueAt(w3, 3, 0);
        table.setValueAt(w3P, 4, 0);
        table.setValueAt(w4, 5, 0);
        table.setValueAt(w4P, 6, 0);
        table.setValueAt(w5, 7, 0);
        table.setValueAt(w5P, 8, 0);

        table.setValueAt("1 in 55", 0, 1);
        table.setValueAt("1 in 111", 1, 1);
        table.setValueAt("1 in 706", 2, 1);
        table.setValueAt("1 in 360", 3, 1);
        table.setValueAt("1 in 12,245", 4, 1);
        table.setValueAt("1 in 19,088", 5, 1);
        table.setValueAt("1 in 648,976", 6,1);
        table.setValueAt("1 in 5,153,633", 7, 1);
        table.setValueAt("1 in 175,223,510", 8, 1);

        for(int i = 0; i < 10; i++)
        {
            table.setRowHeight(i, table.getRowHeight(i) + 10);
        }

        for(int i = 0; i < columnNames.length; i++)
        {
            TableColumn column = table.getColumnModel().getColumn(i);
            column.setPreferredWidth(column.getPreferredWidth() + 80);
        }
    }

以下是JPanel试图显示我的LotteryTable的主要类。

public class LotteryDisplay
{
private JFrame display;
private JPanel panel;
private LotteryTable table;
private static JCheckBox powerPlay;

public LotteryDisplay()
{
    display = new JFrame("Powerball");
    panel = new JPanel();
    table = new LotteryTable();
    powerPlay = new JCheckBox("Power Play");
    panel.setPreferredSize(new Dimension(800, 300));

    panel.add(powerPlay);

    //JTableHeader header = table.getTableHeader(); //Not important to problem
    //panel.add(header);

    panel.add(table);

    display.getContentPane().add(panel, BorderLayout.CENTER);
    display.pack();
    display.setVisible(true);
}

3 个答案:

答案 0 :(得分:4)

LotteryTable扩展JTable,但随后在内部创建了另一个JTable,它永远不会添加到任何能够显示它的组件中。

至于你的第二个问题......这是有争议的。我认为为您添加的功能扩展JTable没有特别的好处。使用static传递JTable

import java.awt.BorderLayout; import java.awt.EventQueue; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.table.DefaultTableModel; public class LotteryTable { public static void main(String[] args) { new LotteryTable(); } public LotteryTable() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JTable table = new JTable(); configureLotteryTable(table); JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new JScrollPane(table)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public static final String[] COLUMN_NAMES = {"Powerball Combos", "Odds of Winning", "Payout", "Number of Wins", "Win Frequency"}; public static void configureLotteryTable(JTable table) { DefaultTableModel model = new DefaultTableModel(COLUMN_NAMES, 0) { @Override public Class<?> getColumnClass(int columnIndex) { Class clazz = String.class; switch (columnIndex) { case 0: clazz = ImageIcon.class; break; default: clazz = String.class; break; } return clazz; } }; table.setModel(model); model.addRow(new Object[]{new ImageIcon(LotteryTable.class.getResource("/icons/Powerball.png")), "1 in 55"}); model.addRow(new Object[]{new ImageIcon(LotteryTable.class.getResource("/icons/Powerball.png")), "1 in 111"}); model.addRow(new Object[]{new ImageIcon(LotteryTable.class.getResource("/icons/Powerball.png")), "1 in 706"}); model.addRow(new Object[]{new ImageIcon(LotteryTable.class.getResource("/icons/Powerball.png")), "1 in 360"}); model.addRow(new Object[]{new ImageIcon(LotteryTable.class.getResource("/icons/Powerball.png")), "1 in 12,245"}); model.addRow(new Object[]{new ImageIcon(LotteryTable.class.getResource("/icons/Powerball.png")), "1 in 19,088"}); model.addRow(new Object[]{new ImageIcon(LotteryTable.class.getResource("/icons/Powerball.png")), "1 in 648,976"}); model.addRow(new Object[]{new ImageIcon(LotteryTable.class.getResource("/icons/Powerball.png")), "1 in 5,153,633"}); model.addRow(new Object[]{new ImageIcon(LotteryTable.class.getResource("/icons/Powerball.png")), "1 in 175,223,510"}); } } 配置方法可以很容易地实现这一点

工作示例

{{1}}

我会花更多时间阅读How to use Tables来梳理一些概念;)

答案 1 :(得分:1)

无论你想用内心做什么 JTable,您应该在父LotteryTable上进行。

为了便于说明,我将table的引用替换为this

public class LotteryTable extends JTable {
    private static final String[] COLUMN_NAMES = { 
                                    "Powerball Combos",
                                    "Odds of Winning", 
                                    "Payout", 
                                    "Number of Wins", 
                                    "Win Frequency" };

    public LotteryTable() {
        super(new DefaultTableModel(COLUMN_NAMES, 9));
        tableSetup();
        setVisible(true);
    }

    @Override
    public Class<?> getColumnClass(int column) {
        if (column == 0)
            return ImageIcon.class;
        else
            return String.class;
    }

    private void tableSetup() {
        DefaultTableCellRenderer dtcr = new DefaultTableCellRenderer();
        dtcr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
        this.setDefaultRenderer(String.class, dtcr);

        ImageIcon p = new ImageIcon("Icons/Powerball.png");
        ImageIcon w1p = new ImageIcon("Icons/WhiteplusPowerball.png");
        ImageIcon w2P = new ImageIcon("Icons/2WhitePlusPowerball.png");
        ImageIcon w3P = new ImageIcon("Icons/3WhitePlusPowerball.png");
        ImageIcon w4P = new ImageIcon("Icons/4WhitePlusPowerball.png");
        ImageIcon w5P = new ImageIcon("Icons/5WhitePlusPowerball.png");
        ImageIcon w3 = new ImageIcon("Icons/3White.png");
        ImageIcon w4 = new ImageIcon("Icons/4White.png");
        ImageIcon w5 = new ImageIcon("Icons/5White.png");

        this.setValueAt(p, 0, 0);
        this.setValueAt(w1p, 1, 0);
        this.setValueAt(w2P, 2, 0);
        this.setValueAt(w3, 3, 0);
        this.setValueAt(w3P, 4, 0);
        this.setValueAt(w4, 5, 0);
        this.setValueAt(w4P, 6, 0);
        this.setValueAt(w5, 7, 0);
        this.setValueAt(w5P, 8, 0);

        this.setValueAt("1 in 55", 0, 1);
        this.setValueAt("1 in 111", 1, 1);
        this.setValueAt("1 in 706", 2, 1);
        this.setValueAt("1 in 360", 3, 1);
        this.setValueAt("1 in 12,245", 4, 1);
        this.setValueAt("1 in 19,088", 5, 1);
        this.setValueAt("1 in 648,976", 6, 1);
        this.setValueAt("1 in 5,153,633", 7, 1);
        this.setValueAt("1 in 175,223,510", 8, 1);

        for (int i = 0; i < 10; i++) {
            this.setRowHeight(i, this.getRowHeight(i) + 10);
        }

        for (int i = 0; i < COLUMN_NAMES.length; i++) {
            TableColumn column = this.getColumnModel().getColumn(i);
            column.setPreferredWidth(column.getPreferredWidth() + 80);
        }
    }
}

答案 2 :(得分:0)

我宁愿使用JFrameJDialog并放置JPanel来展示您的JTable