2014-01-29 1 views
4

Я удалил большую часть своего графического интерфейса, чтобы сохранить код коротким.Изменение столбцов в JTable с помощью JRadioButtons не обновляет структуру

У меня есть ButtonGroup 3 JRadioButton, чтобы выбрать схему таблицы я хочу, чтобы отобразить в моей 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())); 
} 
} 
+1

Что касается вашей модели данных, фактически изменилось то, что таблица s действительно ли может измениться? Если данные не изменились, то почему таблица должна? – MadProgrammer

+0

((DefaultTableModel) target.getDataTable(). GetModel()). setColumnIdentifiers (target.getColumns (targetBtn.getText())); Я пытаюсь изменить заголовки столбцов, используя эту функцию в слушателе. Я возвращаю вектор из target.getColumns (targetBtn.getText()); для использования с http://docs.oracle.com/javase/7/docs/api/javax/swing/table/DefaultTableModel.html#setColumnIdentifiers(java.util.Vector) –

+0

Я написал простой тест, который (очень в основном) делает то, что вы пытаетесь сделать, и работает отлично (без использования методов fireXxx). Подумайте о том, чтобы обеспечить демонстрационный пример, который демонстрирует вашу проблему. – MadProgrammer

ответ

5

В вашем примере, вы не зарегистрировав ActionListener к profsBtn или officeSpBtn, вы продолжаете регистрации на 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 на правильные кнопки, то отлично работает

+0

спасибо.lol what a goof Я –

+1

Я нашел это просто, поместив точку останова в 'ActionListener', когда он не отключился, я вернулся, чтобы проверить, что регистрируется« ActionListener ». Хотя я не буду говорить, что иногда вы не можете видеть лес для деревьев, это должно иметь набор будильников;) – MadProgrammer

+1

* «Я нашел это просто, поставив точку останова в« ActionListener »,« * вы дети и ваши высокотехнологичные. 'контрольные точки'! Я узнал о низкотехнологичных. путем добавления инструкции 'System.out.println (" Event: "+ e);'. Это было основано на моем давнем принципе * «Когда вы сомневаетесь, распечатайте!» *. Но в случае, если кто-то запутался, *** использование отладчика с точками останова более оптимально. *** –

5

Проблема, кажется, что код добавляет слушателю 3 раза в одной кнопки, а не один раз в каждой из 3-х кнопок!

..my приложение предназначено для ограниченного использования и может обойтись без менеджера макета для моих целей, если вы не считаете, что это влияет на поведение таблицы?

Нет, не стол. Однако это привело к тому, что 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())); 
} 
} 
+0

См. Также редактирование .. –

+2

Остановитесь, я не могу это сделать больше;) – MadProgrammer

+0

очень ценю –