首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JTable工作,但JTable子类不工作

JTable工作,但JTable子类不工作
EN

Stack Overflow用户
提问于 2015-04-05 02:56:48
回答 1查看 90关注 0票数 1

我有这样的代码,完全按照需要工作。

代码语言:javascript
复制
package com.grantbroadwater.signInAssistant.view;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

import org.junit.Test;

import com.grantbroadwater.school.Student;

public class SignInSheetTableTest implements ActionListener{

static SignInSheetTableModel model;
static JTextField tfFirst, tfLast;
static JTable table;

public SignInSheetTableTest() {
    // TODO Auto-generated constructor stub
}

private static JPanel createContentPanel(){
    JPanel panel = new JPanel(new GridLayout(1, 0));

    table = new JTable(new SignInSheetTableModel());
    model = (SignInSheetTableModel)table.getModel();
    table.setPreferredScrollableViewportSize(new Dimension(500, 80));
    table.setFillsViewportHeight(true);

    JScrollPane scrollPane = new JScrollPane(table);

    panel.add(scrollPane);

    return panel;
}

private static void createAndShowGUI(){
    JFrame frame = new JFrame("Table Test");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel = SignInSheetTableTest.createContentPanel();
    panel.setOpaque(true);

    JPanel entryPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
    tfFirst = new JTextField(8);
    tfLast = new JTextField(8);
    JButton btnAdd = new JButton("Add");
    btnAdd.addActionListener(new SignInSheetTableTest());
    JButton btnDelete = new JButton("Delete");
    btnDelete.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            int rowIndex = table.getSelectedRow();
            model.deleteRow(rowIndex);
        }
    });

    entryPanel.add(tfFirst);
    entryPanel.add(tfLast);
    entryPanel.add(btnAdd);
    entryPanel.add(btnDelete);

    JPanel housingPanel = new JPanel(new BorderLayout());
    housingPanel.add(entryPanel, BorderLayout.NORTH);
    housingPanel.add(panel, BorderLayout.CENTER);

    frame.setContentPane(housingPanel);

    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            createAndShowGUI();
        }
    });
}

@Override
public void actionPerformed(ActionEvent e) {
    String first = tfFirst.getText();
    String last = tfLast.getText();

    Student s = new Student(first, last, "11111");

    model.addStudent(s);

    table.scrollRectToVisible(table.getCellRect(table.getRowCount() - 1, 0, true));
}

@Test
public void test(){
    main(null);

    try {
        Thread.sleep(15000);
    } catch (InterruptedException e) {}

}

}

但是,当我将JTable实例更改为JTable的SignInSheetTable子类并将构造函数更改为new SignInSheetTable()时,程序仍将执行,但不会出现JTable。我找不到任何解决方案,我完全不明白为什么子类不能工作,而超类将在下面显示整个SignInSheetTable类。

代码语言:javascript
复制
package com.grantbroadwater.signInAssistant.view;

import javax.swing.JTable;

import com.grantbroadwater.school.Student;
import com.grantbroadwater.util.Log;
import com.grantbroadwater.util.Log.LogType;

public class SignInSheetTable extends JTable{

private static final long serialVersionUID = 1L;
private SignInSheetTableModel model;

public SignInSheetTable() {
    super(new SignInSheetTableModel());
    model = (SignInSheetTableModel) super.getModel();

    this.setFillsViewportHeight(true);
    new Log(LogType.DEBUG, "new Sign In sheet");
}

public SignInSheetTableModel getModel() {
    return model;
}

public void addStudent(Student student) {
    model.addStudent(student);
}

public void deleteRow(int rowIndex) {
    model.deleteRow(rowIndex);
}

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-05 03:28:36

覆盖getModel似乎会导致程序的其他部分出现问题。不管怎么说,这并不是你想要达到的目标。

就我个人而言,我不会费心使用自定义表,您不会向类添加任何新功能,该类不能通过模型直接管理,这也是管理应该执行的地方。

我还会担心static的过度使用,因为随着程序变得更大,这可能会引起一些问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29453661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档