使用JRadioButtons更改JTable中的列不会刷新结构

时间:2014-01-29 01:46:15

标签: java swing jtable actionlistener jradiobutton

我删除了大部分GUI以保持代码简短。

我有3个JRadioButtons的buttongroup来选择我想要在我的JTable中显示的表模式,它包含在JScrollPane

我尝试使用fireTableStructureChanged()fireTableDataChanged()以及JTable.repaint()无济于事。任何人都可以帮助我吗?

这是一个使用我的配置运行窗口但不更新表的简单示例。

public class test1 implements ActionListener {

private boolean payrollActive = false;

private JPanel mainPanel = new JPanel();
private JTable dataTable;

private Vector<String> courseColumns = new Vector<String>();
private Vector<String> courseColumnsPay = new Vector<String>();
private Vector<String> profsColumns = new Vector<String>();
private Vector<String> offSpaceColumns = new Vector<String>();

public test1() {
    //Add columns for tables
    String[] courseColsPay = {"Year", "Program", "Course", "Code", "CCCode", 
            "Weight", "Session", "Section", "Day", "STime", "FTime", 
            "BookedRM", "EnrolCap", "Description", "ProfFName", 
            "ProfLName", "ProfEmail", "Notes", "Syllabus", "Exam", 
            "CrossList", "PreReqs", "EnrolCtrls", "Shared",
            "TrackChanges", "Address", "WageType", "BasePay",
            "BenefitRate", "Budgeted", "PayAmount", 
            "MthAmount", "Term", "AccNumber", "PayAdmin", "PayableTo"};
    for (String col : courseColsPay) {
        courseColumnsPay.add(col);
    }
    for (int i = 0; i < 25; i++) {
        courseColumns.add(courseColsPay[i]);
    }
    String[] profCols = {"FName", "LName", "Email", "UTEmail", "Birthdate", 
            "OfficeBC", "OfficeRM", "Department", "Status", 
            "Fellowship", "OfficeStat", "PhoneNum", "HomeAddr",
            "HomePhoneNum", "Notes"};
    for (String col : profCols) {
        profsColumns.add(col);
    }
    String[] offSpaceCols = {"Building", "DeptID", "DivisionName", "BldgID", "RoomID",
            "Category", "Description", "ShareType", "DeptName",
            "Status", "SharePerc", "ShareOccupancy", "Area",
            "Fellow", "Commments", "Name", "Position",
            "Dept", "FTE", "CrossApp", "CrossPos", "CrossDept",
            "CrossFTE", "OtherOffice"};
    for (String col : offSpaceCols) {
        offSpaceColumns.add(col);
    }
    mainPanel.setSize(1260, 630);
    mainPanel.setLayout(null);

    JRadioButton coursesBtn = new JRadioButton("Courses");
    coursesBtn.setMnemonic(KeyEvent.VK_C);
    coursesBtn.setActionCommand("Course");
    coursesBtn.setSelected(true);
    coursesBtn.addActionListener(this);

    JRadioButton profsBtn = new JRadioButton("Professors");
    profsBtn.setMnemonic(KeyEvent.VK_P);
    profsBtn.setActionCommand("Professors");
    coursesBtn.addActionListener(this);

    JRadioButton officeSpBtn = new JRadioButton("Office Spaces");
    officeSpBtn.setMnemonic(KeyEvent.VK_O);
    officeSpBtn.setActionCommand("Office Spaces");
    coursesBtn.addActionListener(this);

    ButtonGroup tablesBtns = new ButtonGroup();
    tablesBtns.add(coursesBtn);
    tablesBtns.add(profsBtn);
    tablesBtns.add(officeSpBtn);

    JPanel tableRadioPanel = new JPanel(new GridLayout(0, 1));
    tableRadioPanel.setOpaque(true);
    tableRadioPanel.setBounds(0, 0, 150, 70);
    tableRadioPanel.add(coursesBtn);
    tableRadioPanel.add(profsBtn);
    tableRadioPanel.add(officeSpBtn);

    //table start
    DefaultTableModel coursesModel = new DefaultTableModel(courseColumns, 200);
    dataTable = new JTable(coursesModel);
    dataTable.setFillsViewportHeight(true);
    dataTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    JScrollPane scrollPane = new JScrollPane(dataTable, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
            JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    scrollPane.setBounds(160, 0, 1016, 558);
    //table code end

    mainPanel.add(tableRadioPanel);
    mainPanel.add(scrollPane);

}

public JComponent getMainPanel() {
    return mainPanel;
}

public JTable getDataTable() {
    return dataTable;
}


/**
 * Returns the list of columns for the given table
 * @param identifier the name of the table
 * @return a Vector<String> of column names
 */
public Vector<String> getColumns(String identifier) {
    switch (identifier) {
    case "Courses":
        if (payrollActive) {
            return courseColumnsPay;
        } else {
            return courseColumns;
        }
    case "Professors":
        return profsColumns;
    case "Office Spaces":
        return offSpaceColumns;
    default:
        return null;
    }
}

public static void createAndShowGui() {
    test1 vicu = new test1();

    JFrame frame = new JFrame("Victoria University Database Application");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(1260, 630);
    frame.setLocationRelativeTo(null);
    JLabel emptyLabel = new JLabel("");
    emptyLabel.setPreferredSize(new Dimension(175, 100));
    frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);
    frame.getContentPane().add(vicu.getMainPanel());
    frame.getContentPane().setLayout(null);
    frame.setVisible(true);

}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGui();
        }
    });

}

@Override
public void actionPerformed(ActionEvent e) {
    JRadioButton targetBtn = (JRadioButton) e.getSource();
    ((DefaultTableModel) dataTable.getModel()).
    setColumnIdentifiers(getColumns(targetBtn.getText()));
}
}

2 个答案:

答案 0 :(得分:5)

问题似乎是代码将监听器添加了3次到一个按钮,而不是每个按钮都添加一次!

  

..我的应用程序的范围非常有限,除非您认为这会影响表的行为,否则我可以不使用布局管理器吗?

不,不是桌子。然而,它导致emptyLabel在布局中没有分配空间。这是一个强大的,可调整大小的GUI版本。

enter image description here

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
import java.util.*;

public class test1 implements ActionListener {

private boolean payrollActive = false;

private JPanel mainPanel = new JPanel(new BorderLayout(5,5));
private JTable dataTable;

private Vector<String> courseColumns = new Vector<String>();
private Vector<String> courseColumnsPay = new Vector<String>();
private Vector<String> profsColumns = new Vector<String>();
private Vector<String> offSpaceColumns = new Vector<String>();

public test1() {
    mainPanel.setBorder(new EmptyBorder(5,5,5,5));
    //Add columns for tables
    String[] courseColsPay = {"Year", "Program", "Course", "Code", "CCCode",
            "Weight", "Session", "Section", "Day", "STime", "FTime",
            "BookedRM", "EnrolCap", "Description", "ProfFName",
            "ProfLName", "ProfEmail", "Notes", "Syllabus", "Exam",
            "CrossList", "PreReqs", "EnrolCtrls", "Shared",
            "TrackChanges", "Address", "WageType", "BasePay",
            "BenefitRate", "Budgeted", "PayAmount",
            "MthAmount", "Term", "AccNumber", "PayAdmin", "PayableTo"};
    for (String col : courseColsPay) {
        courseColumnsPay.add(col);
    }
    for (int i = 0; i < 25; i++) {
        courseColumns.add(courseColsPay[i]);
    }
    String[] profCols = {"FName", "LName", "Email", "UTEmail", "Birthdate",
            "OfficeBC", "OfficeRM", "Department", "Status",
            "Fellowship", "OfficeStat", "PhoneNum", "HomeAddr",
            "HomePhoneNum", "Notes"};
    for (String col : profCols) {
        profsColumns.add(col);
    }
    String[] offSpaceCols = {"Building", "DeptID", "DivisionName", "BldgID", "RoomID",
            "Category", "Description", "ShareType", "DeptName",
            "Status", "SharePerc", "ShareOccupancy", "Area",
            "Fellow", "Commments", "Name", "Position",
            "Dept", "FTE", "CrossApp", "CrossPos", "CrossDept",
            "CrossFTE", "OtherOffice"};
    for (String col : offSpaceCols) {
        offSpaceColumns.add(col);
    }

    //mainPanel.setSize(1260, 630);
    //mainPanel.setLayout(null);

    JRadioButton coursesBtn = new JRadioButton("Courses");
    coursesBtn.setMnemonic(KeyEvent.VK_C);
    coursesBtn.setActionCommand("Course");
    coursesBtn.setSelected(true);
    coursesBtn.addActionListener(this);

    JRadioButton profsBtn = new JRadioButton("Professors");
    profsBtn.setMnemonic(KeyEvent.VK_P);
    profsBtn.setActionCommand("Professors");
    profsBtn.addActionListener(this);

    JRadioButton officeSpBtn = new JRadioButton("Office Spaces");
    officeSpBtn.setMnemonic(KeyEvent.VK_O);
    officeSpBtn.setActionCommand("Office Spaces");
    officeSpBtn.addActionListener(this);

    ButtonGroup tablesBtns = new ButtonGroup();
    tablesBtns.add(coursesBtn);
    tablesBtns.add(profsBtn);
    tablesBtns.add(officeSpBtn);

    JPanel tableRadioPanel = new JPanel(new GridLayout(0, 1));
    tableRadioPanel.add(coursesBtn);
    tableRadioPanel.add(profsBtn);
    tableRadioPanel.add(officeSpBtn);

    //table start
    DefaultTableModel coursesModel = new DefaultTableModel(courseColumns, 200);
    dataTable = new JTable(coursesModel);
    dataTable.setFillsViewportHeight(true);
    dataTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    JScrollPane scrollPane = new JScrollPane(dataTable, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    //scrollPane.setBounds(160, 0, 1016, 558);
    //table code end

    JPanel gridConstrain = new JPanel();
    gridConstrain.add(tableRadioPanel);
    mainPanel.add(gridConstrain, BorderLayout.LINE_START);
    mainPanel.add(scrollPane);

}

public JComponent getMainPanel() {
    return mainPanel;
}

public JTable getDataTable() {
    return dataTable;
}


/**
 * Returns the list of columns for the given table
 * @param identifier the name of the table
 * @return a Vector<String> of column names
 */
public Vector<String> getColumns(String identifier) {
    switch (identifier) {
    case "Courses":
        if (payrollActive) {
            return courseColumnsPay;
        } else {
            return courseColumns;
        }
    case "Professors":
        return profsColumns;
    case "Office Spaces":
        return offSpaceColumns;
    default:
        return null;
    }
}

public static void createAndShowGui() {
    test1 vicu = new test1();

    JFrame frame = new JFrame("Victoria University Database Application");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    JLabel emptyLabel = new JLabel("Empty Label");
    emptyLabel.setFont(emptyLabel.getFont().deriveFont(80f));
    //emptyLabel.setPreferredSize(new Dimension(175, 100));
    frame.getContentPane().add(emptyLabel, BorderLayout.PAGE_START);
    frame.getContentPane().add(vicu.getMainPanel());
    frame.pack();
    frame.setVisible(true);

}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGui();
        }
    });

}

@Override
public void actionPerformed(ActionEvent e) {
    System.out.println("Event: " + e);
    JRadioButton targetBtn = (JRadioButton) e.getSource();
    ((DefaultTableModel) dataTable.getModel()).
    setColumnIdentifiers(getColumns(targetBtn.getText()));
}
}

答案 1 :(得分:5)

在您的示例中,您没有注册ActionListenerprofsBtnofficeSpBtn,而是继续注册coursesBtn

JRadioButton coursesBtn = new JRadioButton("Courses");
//...
coursesBtn.addActionListener(this);

JRadioButton profsBtn = new JRadioButton("Professors");
//...
coursesBtn.addActionListener(this);

JRadioButton officeSpBtn = new JRadioButton("Office Spaces");
//...
coursesBtn.addActionListener(this);

一旦我将ActionListener注册到正确的按钮,它就可以正常工作

相关问题