2015-12-10 4 views
0

enter image description here Я использую JTable с двумя кнопками (Active Неактивные кнопки). Когда я нажимаю на кнопку «Неактивно», я прячу первый столбец таблицы. Также я пытаюсь показать первый столбец, когда я нажимаю на кнопку «Актив». Но проблема в том, что когда я нажимаю на кнопку «Актив», я не мог отобразить первый столбец с его предпочтительным размером.Невозможно получить скрытый столбец JTable

Это код скрыть первого столбца,

expTable.getColumnModel().getColumn(0).setMinWidth(0); 
expTable.getColumnModel().getColumn(0).setMaxWidth(0); 
expTable.getColumnModel().getColumn(0).setWidth(0); 

Это код вернуть кулак колонку,

expTable.getColumnModel().getColumn(0).setMinWidth(0); 
expTable.getColumnModel().getColumn(0).setMaxWidth(300); 
expTable.getColumnModel().getColumn(0).setWidth(100); 

Сначала я нажать на кнопку неактивной, а затем я нажимаю на активная кнопка. Но это не работает.

Есть идеи, как это сделать выше.

private void inactiveButtonActionPerformed(java.awt.event.ActionEvent evt){             
    expTable.getColumnModel().getColumn(0).setMinWidth(0); 
    expTable.getColumnModel().getColumn(0).setMaxWidth(0); 
    expTable.getColumnModel().getColumn(0).setWidth(0); 
    } 


private void activeButtonActionPerformed(java.awt.event.ActionEvent evt)            
    {             
     expTable.getColumnModel().getColumn(0).setMinWidth(0); 
     expTable.getColumnModel().getColumn(0).setMaxWidth(300); 
     expTable.getColumnModel().getColumn(0).setWidth(100); 
    } 
+1

Рассмотрите возможность предоставления [runnable example] (https://stackoverflow.com/) помощь/MCV e), который демонстрирует вашу проблему. Это не дамп кода, а пример того, что вы делаете, что подчеркивает проблему, с которой вы сталкиваетесь. Это приведет к меньшему путанице и лучшим ответам. – MadProgrammer

+1

Обычно, когда я делал это в прошлом, я просто хватаю ссылку на «TableColumn» и удаляю ее из «ColumnModel» и добавляю ее снова, когда это необходимо – MadProgrammer

+0

@MadProgrammer: - Можете ли вы привести мне пример? Я работаю над массивным проектом качания, поэтому я не смог опубликовать в нем какой-либо код. – Barrier

ответ

3

В прошлом, когда я должен сделать что-то подобное, я просто вынимается и снова добавили TableColumn

Это довольно грубый пример концепции ...

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JToggleButton; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableColumn; 
import javax.swing.table.TableColumnModel; 

public class Main { 
    public static void main(String[] args) { 
     new Main(); 
    } 
    public Main() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new BorderLayout()); 
      DefaultTableModel model = new DefaultTableModel(); 
      model.addColumn("Column 1"); 
      model.addColumn("Column 2"); 
      model.addColumn("Column 3"); 
      model.addColumn("Column 4"); 
      model.setRowCount(100); 

      JTable table = new JTable(model); 
      add(new JScrollPane(table)); 

      JToggleButton toggle = new JToggleButton("Toggle"); 
      toggle.addActionListener(new ActionListener() { 
       private TableColumn column; 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        TableColumnModel columnModel = table.getColumnModel(); 
        if (toggle.isSelected()) { 
         column = columnModel.getColumn(0); 
         table.getColumnModel().removeColumn(column); 
        } else if (column != null) { 
         columnModel.addColumn(column); 
         columnModel.moveColumn(columnModel.getColumnCount() - 1, 0); 
        } 
       } 
      }); 
      add(toggle, BorderLayout.SOUTH); 
     } 

    } 
} 

Я действительно потратил некоторое время на создание пользовательского TableModel, который предоставляет возможность скрывать и показывать столбцы, которые в основном завертывают эту функциональность в приятный многоразовый пакет.

+0

Могу ли я это использовать для таблицы, которая находится в DefaultTableModel? И можно ли использовать JButton вместо JToogleButton? – Barrier

+0

Да, попробуйте – MadProgrammer

+0

Я сделал это, но есть исключение. Исключение в потоке «AWT-EventQueue-0» java.lang.IllegalArgumentException: Object имеет значение null \t at javax.swing.table.DefaultTableColumnModel.addColumn (DefaultTableColumnModel.java:117) – Barrier

5

Не пытайтесь «маскирует» TableColumn, играя с шириной. TableColumn все еще является частью таблицы, поэтому, когда пользователь переходит от столбца к столбцу, фокус переходит в скрытый столбец и исчезает из представления пользователей, которое очень запутывает.

Вместо этого вы должны удалить TableColumn с TableColumnModel. Затем вы можете добавить TableColumn обратно в TableColumnModel при необходимости.

Проверьте Table Column Manager, который управляет этой концепцией для вас. Если вы не используете полную функциональность класса, вы можете использовать hideColumn(...) и showColumn(...), чтобы сделать простой переключатель в первом столбце.

Смежные вопросы