簡體   English   中英

JCheckBox 檢查 JTable 列中的值

[英]JCheckBox checks for values in JTable column

我是 Java GUI 的初學者。

我有一個帶有幾列的JTable ,其中一列具有某些行的值,而其他一些行則沒有值。

我想讓 JCheckBox 偵聽器查看 JTable 的該列中是否有值,以及是否選擇了該框來對顯示這些值的表進行排序。 如果我取消選中該框,我希望表格顯示為該列中沒有值。 怎么才能做到以上幾點? 謝謝你。 這是我的代碼。 我還有兩個 JComboBox 可以做我想讓他們做的事情。

public class myGui extends JPanel implements ActionListener{

JPanel pane = new JPanel();
JPanel pane2 = new JPanel();    
AccomodationList list;
String[] roomOrCabin = {"Room","Cabin"};
String[] booked = {"Booked","Not Booked","All"};
JComboBox dropRoom = new JComboBox(roomOrCabin); 
JComboBox dropBook = new JComboBox(booked);
JCheckBox ownerButton = new JCheckBox("Owner",true);
JTable table;
DefaultTableModel model;
Vector<String> columnNames;
TableRowSorter<TableModel> trs;

public myGui(AccomodationList list){

    super(new BorderLayout());
    pane.setLayout( new BorderLayout() );

    columnNames = new Vector<String>();             

    columnNames.addElement("Accomodation Number");
    columnNames.addElement("Number of Beds");
    columnNames.addElement("Number of Rooms");
    columnNames.addElement("Type");
    columnNames.addElement("Cost per Night");
    columnNames.addElement("Owner");
    columnNames.addElement("Booked");
    columnNames.addElement("Client");
    columnNames.addElement("Booked Statistics");        

    Vector<Vector> f = populateTable(list);

    table = new JTable(f, columnNames);
    JScrollPane scroll = new JScrollPane(table);
    model = new DefaultTableModel(f,columnNames){
        @Override
        public Class getColumnClass(int column) {
          Class returnValue;
          if ((column >= 0) && (column < getColumnCount())) {
            returnValue = getValueAt(0, column).getClass();
          } else {
            returnValue = Object.class;
          }
          return returnValue;
        }
    };
    trs = new TableRowSorter<TableModel>(model);


    table.setRowSorter(trs);

    this.list = list;
    pane.add(table);
    JScrollPane scrollPane = new JScrollPane( table );
    table.setAutoCreateRowSorter(false);
    pane.add( scrollPane, BorderLayout.CENTER );

    pane2.add(dropRoom);
    pane2.add(dropBook);
    pane2.add(ownerButton);
    pane.add(pane2,BorderLayout.SOUTH);
    this.add(pane);
    dropRoom.addActionListener(this);
    dropBook.addActionListener(this);
    ownerButton.addActionListener(this);

}

public Vector<Vector> populateTable(AccomodationList list){

    Vector<Vector> f = new Vector<Vector>();

    String t;

    for(Accomodation a: list.getList()){
        Vector<Object> v = new Vector<Object>();
        t=String.valueOf(a.getNoAcc());
        v.addElement(a.getNoAcc()); 
        t=String.valueOf(a.getSumOfBeds());
        v.addElement(t);    
        t=String.valueOf(a.getNoBedrooms());
        v.addElement(t);    
        t=String.valueOf(a.getType());
        v.addElement(t);
        t=String.valueOf(a.getCost());
        v.addElement(t);
        t=String.valueOf(a.getInitials(a.getOwner()));
        v.addElement(t);
        t=String.valueOf(a.getBooked().toString());
        v.addElement(t);
        t=String.valueOf(a.getInitials(a.getClient()));
        v.addElement(t);
        t=String.valueOf(a.getBookedCnt());
        v.addElement(t);

        f.addElement(v);
    }
    return f;

}

@Override
public void actionPerformed(ActionEvent e) {

    if(e.getSource() == dropRoom){
                String text = dropRoom.getSelectedItem().toString();
                System.out.println("text: "+text);
                if (text.length() == 0) {
                  trs.setRowFilter(null);
                } else {
                  try {
                    trs.setRowFilter(
                        RowFilter.regexFilter(text));
                  } catch (PatternSyntaxException pse) {
                    System.err.println("Bad regex pattern");
                  }
                }                                  
    }

    if(e.getSource() == dropBook){
                String selected = dropBook.getSelectedItem().toString();
                String text="";
                if ("Booked".equals(selected)){text = "true";}else if("Not Booked".equals(selected)){text = "false";}else{text = "";}
                if (text.length() == 0) {
                  trs.setRowFilter(null);
                } else {
                    try {
                      trs.setRowFilter(
                          RowFilter.regexFilter(text));
                    } catch (PatternSyntaxException pse) {
                      System.err.println("Bad regex pattern");
                    }
                } 

    }
    if(e.getSource() == ownerButton){
        JCheckBox cb = (JCheckBox) e.getSource();
        if (cb.isSelected()) {

                System.out.println("Owner is enabled");

        } 
        else {
            System.out.println("Owner is disabled");


        }

    }
}


}

每行可以有或沒有列所有者的String值。 我想使用 JCheckBox 根據這兩個事實對表格進行排序。

首先,您需要在復選框中添加一個偵聽器,如下所示:

checkbox.addItemListener(new ItemListener() {

    @Override
    public void itemStateChanged(ItemEvent e) {
        if(e.getStateChange() == ItemEvent.SELECTED) {


        }else {


        }
    }
});

現在的問題是當您選中復選框時您想做什么。 您需要在表模型中使用某種排序算法。 這個網站有一個很好的例子:

http://www.java2s.com/Tutorial/Java/0240__Swing/SampleSortingTableModel.htm

您只需要向表模型中表示的實體對象添加某種Comparable即可。 默認情況下,無論如何都會在底部顯示空值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM