如何向JTable添加动作侦听器?

时间:2015-10-16 04:52:25

标签: java swing jtable actionlistener

这是一个java日历。我想在点击日期时添加弹出窗口和编辑视图的功能。 1.如何向JTable的单元格添加动作侦听器? 2.单击日期(单元格)时存储信息的弹出对话框。

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Calender{
    static JFrame Main_Frame;
    static JButton Prev_button, Next_Button, Today_Button;
    static JLabel Month_Label, Year_Label;
    static JTable Calender_Table;
    static JComboBox Year_Combobox;
    static Container Pane_container;
    static DefaultTableModel Calender_mTable; 
    static JScrollPane SCalender_Table;
    static JPanel Calender_Panel;
    static int Gre_Year, Gre_Month, Gre_Day, Current_Year, Current_Month;

    public static void main (String args[]){
        //try catch
        try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}
        catch (ClassNotFoundException e) {}
        catch (InstantiationException e) {}
        catch (IllegalAccessException e) {}
        catch (UnsupportedLookAndFeelException e) {}

        //create and settup frame
        Main_Frame = new JFrame ("Calender"); 
        Main_Frame.setSize(330, 375); 
        Pane_container = Main_Frame.getContentPane(); 
        Pane_container.setLayout(null); 
        Main_Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


        //Create controls
        Month_Label = new JLabel ("January");
        Year_Label = new JLabel ("Year:");
        Year_Combobox = new JComboBox();
        Prev_button = new JButton ("<");
        Next_Button = new JButton (">");
        Today_Button = new JButton("Today");
        Calender_mTable = new DefaultTableModel(){public boolean isCellEditable(int rowIndex, int mColIndex){return true;}};
        Calender_Table = new JTable(Calender_mTable);
        SCalender_Table = new JScrollPane(Calender_Table);
        Calender_Panel = new JPanel(null);

        //Add all controls to panel
        Pane_container.add(Calender_Panel);
        Calender_Panel.add(Month_Label);
        Calender_Panel.add(Year_Label);
        Calender_Panel.add(Year_Combobox);
        Calender_Panel.add(Prev_button);
        Calender_Panel.add(Next_Button);
        Calender_Panel.add(Today_Button);
        Calender_Panel.add(SCalender_Table);

        //listeners
        Prev_button.addActionListener(new Prev_button_Action());
        Next_Button.addActionListener(new Next_Button_Action());
        Today_Button.addActionListener(new Today_Button_Action());
        Year_Combobox.addActionListener(new Year_Combobox_Action());
       // Calender_Table.addActionListener(new ActionLitsener());
        //Set the border with name
        Calender_Panel.setBorder(BorderFactory.createTitledBorder("Calendar"));



        //Set all element place and size
        Calender_Panel.setBounds(0, 0, 321, 333);
        Month_Label.setBounds(160-Month_Label.getPreferredSize().width/2, 25, 100, 25);
        Year_Label.setBounds(200, 305, 81, 21);
        Year_Combobox.setBounds(230, 305, 81, 21);
        Prev_button.setBounds(10, 25, 51, 26);
        Today_Button.setBounds(128,5,65,26);
        Next_Button.setBounds(260, 25, 51, 26);
        SCalender_Table.setBounds(10, 51, 301, 256);

        //set visible frame
        Main_Frame.setResizable(false);
        Main_Frame.setVisible(true);

        //Getthe month and day from gregorian
        GregorianCalendar calender = new GregorianCalendar(); //Create calendar
        Gre_Day = calender.get(GregorianCalendar.DAY_OF_MONTH); //Get day
        Gre_Month = calender.get(GregorianCalendar.MONTH); //Get month
        Gre_Year = calender.get(GregorianCalendar.YEAR); //Get year
        Current_Month = Gre_Month; //Match month and year
        Current_Year = Gre_Year;

        //Add the headers
        String[] headers = {"Sunday", "Monday", "Tueday", "Wednesday", "Thursday", "Friday", "Saturday"}; //All headers
        for (int i=0; i<7; i++){
            Calender_mTable.addColumn(headers[i]);

        }
        //Set background
        Calender_Table.getParent().setBackground(Calender_Table.getBackground());

        //No resize or reorder

        Calender_Table.getTableHeader().setReorderingAllowed(false);
        Calender_Table.getTableHeader().setResizingAllowed(false);


        //Single cell selection
        Calender_Table.setColumnSelectionAllowed(true);
        Calender_Table.setRowSelectionAllowed(true);
        Calender_Table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        //Set row column
        Calender_Table.setRowHeight(38);
        Calender_mTable.setColumnCount(7);
        Calender_mTable.setRowCount(6);

        //Populate the table
        for (int a=Gre_Year-100; a<=Gre_Year+100; a++){
            Year_Combobox.addItem(String.valueOf(a));
        }

        //Refresh calendar
        Refresh_Calendar (Gre_Month, Gre_Year); //Refresh calendar
    }

    public static void Refresh_Calendar(int month, int year){
        //Variables
        String[] months =  {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
        int dom, dow; //Number Of Days, Start Of Month

        //allow the button = true
        Prev_button.setEnabled(true);
        Next_Button.setEnabled(true);

        if (month == 0 && year <= Gre_Year-10){Prev_button.setEnabled(false);} 
        if (month == 11 && year >= Gre_Year+100){Next_Button.setEnabled(false);} 
        Month_Label.setText(months[month]);
        Month_Label.setBounds(160-Month_Label.getPreferredSize().width/2, 25, 180, 25); 
        Year_Combobox.setSelectedItem(String.valueOf(year));

        //Clear table
        for (int a=0; a<6; a++){
            for (int b=0; b<7; b++){
                Calender_mTable.setValueAt(null, a,b );
            }
        }

        //Get first day of month and number of days
        GregorianCalendar calander = new GregorianCalendar(year, month, 1);
        dom = calander.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
        dow = calander.get(GregorianCalendar.DAY_OF_WEEK);

        //Draw the calendar
        for (int a=1; a<=dom; a++){
            int row = new Integer((a+dow-2)/7);
            int column  =  (a+dow-2)%7;
            Calender_mTable.setValueAt(a, row, column);
        }

        //Apply renderers
        Calender_Table.setDefaultRenderer(Calender_Table.getColumnClass(0), new Calender_TableRenderer());
    }

    static class Calender_TableRenderer extends DefaultTableCellRenderer{
        public Component getTableCellRendererComponent (JTable table, Object value, boolean selected, boolean focused, int row, int column){
            super.getTableCellRendererComponent(table, value, selected, focused, row, column);
            if (column == 0 || column == 6){ //Week-end
                setBackground(new Color(135,206,235));
            }
            else{ //Week days
                setBackground(new Color(255, 255, 255));
            }
            if (value != null){
                if (Integer.parseInt(value.toString()) == Gre_Day && Current_Month == Gre_Month && Current_Year == Gre_Year){ //Today
                    setBackground(Color.lightGray);
                }
            }
          //  getComponent(1).addFocusListener();

            setBorder(null);
            setForeground(Color.blue);
            return this;
        }
    }


    //listener

    //set prev button listener
    static class Prev_button_Action implements ActionListener{
        public void actionPerformed (ActionEvent e){
            if (Current_Month == 0){ 
                Current_Month = 11;
                Current_Year -= 1;
            }
            else{ 
                Current_Month -= 1;
            }
            Refresh_Calendar(Current_Month, Current_Year);
        }
    }

  //set next button listener
    static class Next_Button_Action implements ActionListener{
        public void actionPerformed (ActionEvent e){
            if (Current_Month == 11){ 
                Current_Month = 0;
                Current_Year += 1;
            }
            else{ //Foward one month
                Current_Month += 1;
            }
            Refresh_Calendar(Current_Month, Current_Year);
        }
    }

    static class Today_Button_Action implements ActionListener{
        public void actionPerformed (ActionEvent e){

            Current_Month = Gre_Month ;
            Current_Year = Gre_Year;
             Refresh_Calendar(Current_Month, Current_Year);
        }
    }
    static class Year_Combobox_Action implements ActionListener{
        public void actionPerformed (ActionEvent e){
            if (Year_Combobox.getSelectedItem() != null){
                String b = Year_Combobox.getSelectedItem().toString();
                Current_Year = Integer.parseInt(b);
                Refresh_Calendar(Current_Month, Current_Year);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

要在JTable单元格中添加动作列表器,您可以这样做。您可以将此Calender_Table变量重命名为calenderTable。

calenderTable.addMouseListener(new MouseAdapter() {
  public void mouseClicked(MouseEvent e) {
    if (e.getClickCount() == 2) {
      JTable target = (JTable)e.getSource();
      int row = target.getSelectedRow();
      int column = target.getSelectedColumn();
     // do some stuff
    }
  }
});