добрый день
пытаюсь сделать некий календаррь-планировщик
в каждую ячейку таблицы кладу по JScrollPane, в каждый scrollpane кладу JList, в JLIstзаношу информацию, например, фамилии
по клику на фамилию возникает popup с менюшкой
один из календарей должен редактироваться только для текущей даты, т.е. popup должен возникать только если кликнуть на ячейку с текущей датой(отвечающую за текущую дату)
в этом календаре сразу после его создания popup возникает только для текущий даты, для других не появляется, однако, после того как ткнешь в текущую - он будет появляться для любой даты из это столбца(CellEditor задается для столбоцов)
помогите кто чем может? )
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
class MyListEditor extends AbstractCellEditor implements TableCellEditor {
ScheduleCalendar scheduleCalendar;
JList mlist;
JList cell_info;
TitledBorder scborder = new TitledBorder(BorderFactory.createEmptyBorder(),
"title");
JScrollPane scpane;
Color color_full;
Color color_mid;
Color color_empty;
int cell_full = 2 ;
public MyListEditor() {
mlist = new JList();
cell_info = new JList();
scpane = new JScrollPane();
scpane.setBorder(scborder);
scpane.getViewport().add(mlist);
mlist.setCellRenderer( new MyJListCellRenderer(scpane));
}
public Object getCellEditorValue() {
//scborder.getTitle();
return ((DefaultListModel) cell_info.getModel()).toArray();
}
public Component getTableCellEditorComponent(JTable table,
Object value,
boolean isSelected,
int row,
int column) {
DefaultListModel model = new DefaultListModel();
DefaultListModel cell_model = new DefaultListModel();
Object[] items = (Object[]) value;
cell_model.add( 0 , items[ 0 ]);
for ( int i = 1 ; i < items.length; i++) {
model.add(i - 1 , items[i]);
cell_model.add(i, items[i]);
}
cell_info.setModel(cell_model);
mlist.setModel(model);
mlist.addMouseListener( new PopupListener(
scheduleCalendar, items[ 0 ].toString()));
//mlist.setListData((Object[]) value);
scborder = new TitledBorder(BorderFactory.createEmptyBorder(),
items[ 0 ].toString());
scpane.setBorder(scborder);
scpane.getViewport().add(mlist);
if (cell_full <= items.length - 1 ) {
mlist.setBackground(color_full);
} else if (items.length > 1 ) {
mlist.setBackground(color_mid);
} else {
mlist.setBackground(color_empty);
}
return scpane;
}
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
class MyJobCellRenderer extends JScrollPane implements TableCellRenderer {
Color color_full;
Color color_mid;
Color color_empty;
int cell_full;
private boolean cellHasFocus;
Border scborder;
JList jlist;
public MyJobCellRenderer() {
super ();
// color_full = new Color(205, 255, 204);
// color_mid = new Color(205, 255, 204);
color_full = Color.WHITE;
color_mid = Color.WHITE;
color_empty = Color.white;
cell_full = 2 ;
}
public Component getTableCellRendererComponent(JTable mtable, Object value,
boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) {
// if(isSelected)
// setBackground(mtable.getSelectionBackground() );
// else
// setBackground(Color.white );
// String stmp;
// StringTokenizer st;
// int rowHight=mtable.getRowHeight() +mtable.getRowMargin()+1;
// int fold;
Object[] cell_info = (Object[]) value;
//setListData((Object[])value);
jlist = new JList();
// JScrollPane scpane = new JScrollPane();
DefaultListModel model = new DefaultListModel();
for ( int i = 1 ; i < cell_info.length; i++) {
model.add(i - 1 , cell_info[i]);
}
jlist.setModel(model);
// jlist.setListData((Object[])value);
scborder = new TitledBorder(BorderFactory.createEmptyBorder(),
cell_info[ 0 ].toString());
this .setBorder(scborder);
this .getViewport().add(jlist);
if (cell_full <= cell_info.length - 1 ) {
jlist.setBackground(color_full);
} else if (cell_info.length > 1 ) {
jlist.setBackground(color_mid);
} else {
jlist.setBackground(color_empty);
}
this .setBackground(Color.white);
jlist.setCellRenderer( new MyJListCellRenderer( this ));
return this ;
}
public boolean isOpaque() {
return true;
}
/*
protected void paintComponent(Graphics g) {
g.setColor(Color.white);
g.fillRect(0, 0, getPreferredSize().width, getSize().height);
this.setBorder(scborder);
super.paintComponent(g);
}
*/
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
class PopupListener extends MouseAdapter {
private ScheduleCalendar adaptee;
private String title;
PopupListener(ScheduleCalendar adaptee, String title) {
this .adaptee = adaptee;
this .title = title;
}
public void mouseReleased(MouseEvent e) {
JList theList = ((JList) (e.getSource()));
int index = theList.locationToIndex(e.getPoint());
if (index >= 0 ) {
theList.setSelectedIndex(index);
}
if (e.isPopupTrigger()) {
adaptee.activePopup(e, title);
// e.consume();
}
}
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
public void activePopup(MouseEvent e, String borderTitle) {
String borderMonth = borderTitle.substring( 0 , borderTitle.indexOf(" "));
// it's previous or next month
if (!borderMonth.equals(months[report_month])) {
e.consume();
return ;
}
String borderDay = borderTitle.substring(borderTitle.indexOf(" ") + 1 ,
borderTitle.length());
String selectedJobDate = borderDay +
"-" + monthStart + "-" + jYearChooser1.getYear();
if (mode== this .SINGLE_MODE && (mysys.today.get(Calendar.YEAR)!=jYearChooser1.getYear() ||
mysys.today.get(Calendar.MONTH)!=Integer.valueOf(monthStart)- 1 ||
mysys.today.get(Calendar.DAY_OF_MONTH)!=Integer.valueOf(borderDay))) {
e.consume();
return ;
}
JList theList = ((JList) (e.getSource()));
jMenuAdd.removeAll();
jMenuItemListener = new scheduleCalendar_jMenuItem_mouseAdapter( this , borderDay);
for ( int index = 0 ; index < addConsVector.size(); index++) {
jMenuItem = new JMenuItem(addConsVector.elementAt(index).toString());
// jMenuItem.addMouseListener(jMenuItemListener);
jMenuItem.addActionListener(jMenuItemListener);
jMenuAdd.add(jMenuItem);
}
popup.remove(jMenuItemDelete);
jMenuItemDelete = new JMenuItem("удалить");
if (theList.getModel().getSize() > 0 ) {
String consulter_name = theList.getSelectedValue().
toString();
jMenuItemDelete.setVisible(true);
jMenuItemDelete.addActionListener( new
scheduleCalendar_jMenuItem_mouseAdapterDelete( this ,
borderDay, theList.getSelectedValue().
toString()));
} else {
jMenuItemDelete.setVisible(false);
}
popup.add(jMenuItemDelete);
popup.show(theList, e.getX(), e.getY());
e.consume();
}
если поставить breakpoint на PopupListener, то получается что каждый раз когда кликаем на колонке содержащей текущую дату - сначала приходит ивент на текущую дату, потом на все последующие, которые были "кликнуты", т.е. после каждого клика приходит гнесколько ивентов и последний - на кликнутую дату
p.s. на сколько "не круто" написан код можно не писать, какой достался, прошу помочь решить проблему