powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JList как ячейка JTable
18 сообщений из 18, страница 1 из 1
JList как ячейка JTable
    #34370314
sommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добрый день )
есть необходимость создать таблицу с jlist в ячейках (подобие планировщика задач, календарный view)
пытаюсь использовать код:

Код: plaintext
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.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
 import  javax.swing.*;
 import  java.awt.*;
 import  javax.swing.table.*;

 import  java.util.*;

 import  java.io.*;
 public   class  jtablejlist //extends JFrame
{

 public   void  init()
{
Vector data =  new  Vector();
Vector tmp =  new  Vector();

String[] sdata ={"test1","test2"};
tmp.addElement (sdata);
tmp.addElement ("This is test1");
data.addElement (tmp);

tmp =  new  Vector();
String[] sdata2 ={"stock1","stock2","stock3","stock4"};
tmp.addElement (sdata2);
tmp.addElement ("This is stocks");
data.addElement (tmp);


Vector cols =  new  Vector();
cols.addElement ("col1");
cols.addElement ("col2");

JTable table =  new  JTable(data,cols);
TableColumn column = table.getColumnModel().getColumn( 0 );
MyListEditor area= new  MyListEditor();
// ROWHIGHT=table.getRowHeight() +table.getRowMargin()+1; 
column.setCellEditor(area); 
column.setCellRenderer( new  MyCellRenderer ());

JFrame frame =  new  JFrame();
frame.getContentPane().add( new  JScrollPane(table));
frame.pack();
frame.setVisible(true);
}

 class  MyListEditor  extends  AbstractCellEditor  implements  TableCellEditor
{ 
JList mlist;

 public  MyListEditor()
{
mlist =  new  JList();
} 

 public  Object[] getCellEditorValue() 
{
 return  ((DefaultListModel)mlist.getModel()).toArray();
}

// This method is called when a cell value is edited by the user.
 public  Component getTableCellEditorComponent(JTable table, 
Object value,  boolean  isSelected,  int  row, int  column) 
{ 
mlist.setListData((Object[])value);
 return  mlist;
} 

}

 class  MyCellRenderer  extends  JList  implements  TableCellRenderer 
{
 public  MyCellRenderer(){
 super ();
}
 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;

String[] mlist = (String[]) value;


fold = mlist.length ;

//adjust row height
 if (mtable.getRowHeight(rowIndex)!=fold*rowHight) //otherwise, the save dialog couldn't show normally 
mtable.setRowHeight(rowIndex, fold*rowHight); 


setListData((String[])value);

 return   this ;
} 
}


 public   static   void  main(String[] args)
{
jtablejlist jj = new  jtablejlist();
jj.init();
}

}
http://kidslovepc.com/javatable/java-jtable-jlist-row-height.shtml

проблема в том, что когда переходишь из jlist1 с выбранной строкой в jlist2(другая ячейка) и фокус остается на jlist1, вываливается эксепшен на вызов MyListEditor.getCellEditorValue

не подскажите\поможите как решить проблему?
...
Рейтинг: 0 / 0
JList как ячейка JTable
    #34370348
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подебужте отладчегом. само оно никогда не работает, поскольку не должно
...
Рейтинг: 0 / 0
JList как ячейка JTable
    #34370395
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не плохо было бы привести стек-трейс. Приведу здесь его за Вас:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JList$ 4 
	at jtablejlist$MyListEditor.getCellEditorValue(jtablejlist.java: 53 )
	at jtablejlist$MyListEditor.getCellEditorValue(jtablejlist.java: 45 )
	at javax.swing.JTable.editingStopped(JTable.java: 3332 )

...


Что мы видим: ClassCastException при попытке прикастить модель листа к DefaultListModel.


Смотрим код JList.java (метод, которым Вы воспользовались):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
/**
 * Constructs a <code>ListModel</code> from an array of objects and then
 * applies <code>setModel</code> to it.
 *
 * @param listData an array of Objects containing the items to display
 *                 in the list
 * @see #setModel
 */
 public   void  setListData( final  Object[] listData) {
    setModel (
         new  AbstractListModel() {
             public   int  getSize() {  return  listData.length; }
             public  Object getElementAt( int  i) {  return  listData[i]; }
        }
    );
}


На размышление:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 public  Component getTableCellEditorComponent(JTable table,
                                             Object value, 
                                              boolean  isSelected, 
                                              int  row, 
                                              int  column) {
    
    DefaultListModel model =  new  DefaultListModel();

    Object[] items = (Object[]) value;

     for  ( int  i =  0 ; i < items.length; i++) {
        model.add(i, items[i]);
    }

    mlist.setModel(model);
     return  mlist;
}

P.S. Требует окультуривания.
...
Рейтинг: 0 / 0
JList как ячейка JTable
    #34373019
sommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо, Руслан, помог.

небольшое дополнение - в методе getTableCellRendererComponent нужно все String[] заменить на Object[]
...
Рейтинг: 0 / 0
JList как ячейка JTable
    #34396006
sommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хочу получить таблицу, ячейки которых должны заполнять jlist'ы, и чтобы был некий title в ячейках - соответствующее число - см. картинку
сейчас использую следующий код:
Код: plaintext
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.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
 class  MyListEditor  extends  AbstractCellEditor  implements  TableCellEditor
{
JList mlist;
JScrollPane scpane;
Border scborder =  new  TitledBorder(BorderFactory.createEmptyBorder(), "title");
 

 public  MyListEditor()
{
mlist =  new  JList();
scpane =  new  JScrollPane();
scpane.getViewport().add(mlist);
scpane.setBorder(scborder);

}

 public  Object getCellEditorValue()
{
 return  ((DefaultListModel)mlist.getModel()).toArray();
}

// This method is called when a cell value is edited by the user.
/*public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row,int column)
{
mlist.setListData((Object[])value);
return mlist;
}
*/
     public  Component getTableCellEditorComponent(JTable table,
                                             Object value,
                                              boolean  isSelected,
                                              int  row,
                                              int  column) {

    DefaultListModel model =  new  DefaultListModel();

    Object[] items = (Object[]) value;

     for  ( int  i =  1 ; i < items.length; i++) {
        model.add(i- 1 , items[i]);
    }

    mlist.setModel(model);

//    return mlist;

    Border scborder =  new  TitledBorder(BorderFactory.createEmptyBorder(), items[ 0 ].toString());
    scpane.setBorder(scborder);
    scpane.getViewport().add(mlist);

     return  scpane;


}



}

 class  MyCellRenderer  extends  JList  implements  TableCellRenderer
{
 public  MyCellRenderer(){
 super ();
}
 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[] mlist = (Object[]) value;


fold = mlist.length ;

//adjust row height
//if(mtable.getRowHeight(rowIndex)!=fold*rowHight) //otherwise, the save dialog couldn't show normally
//mtable.setRowHeight(rowIndex, fold*rowHight);
//mtable.setRowHeight(rowIndex, mtable.getHeight()/mtable.getRowCount());
    mtable.setRowHeight(rowIndex,  70 );


//setListData((Object[])value);
   JList jlist =  new  JList();
   JScrollPane scpane =  new  JScrollPane();
   DefaultListModel model =  new  DefaultListModel();
    for  ( int  i =  1 ; i < mlist.length; i++) {
       model.add(i- 1 , mlist[i]);
   }

   jlist.setModel(model);
   Border scborder =  new  TitledBorder(BorderFactory.createEmptyBorder(), mlist[ 0 ].toString());
   scpane.setBorder(scborder);
   scpane.getViewport().add(jlist);

    return  scpane;

    

//return this;
}
}

с одной стороны работает, но реализовано херово, занимает 99%процессорного времени

как изменить getTableCellRendererComponent чтобы меньше занимало системных ресурсов?
...
Рейтинг: 0 / 0
JList как ячейка JTable
    #34396012
sommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здесь жирным выделены titledborder'ы компоненты scrollpane
...
Рейтинг: 0 / 0
JList как ячейка JTable
    #34396255
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это зачем в рендерере?

Код: plaintext
1.
DefaultListModel model =  new  DefaultListModel();

Это ж сколько моделей будет создано, при прорисовках таблицы?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
JList как ячейка JTable
    #39342634
Rintsler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sommerхочу получить таблицу, ячейки которых должны заполнять jlist'ы, и чтобы был некий title в ячейках - соответствующее число - см. картинку
сейчас использую следующий код:
Код: java
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.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
class MyListEditor extends AbstractCellEditor implements TableCellEditor
{
JList mlist;
JScrollPane scpane;
Border scborder = new TitledBorder(BorderFactory.createEmptyBorder(), "title");
 

public MyListEditor()
{
mlist = new JList();
scpane = new JScrollPane();
scpane.getViewport().add(mlist);
scpane.setBorder(scborder);

}

public Object getCellEditorValue()
{
return ((DefaultListModel)mlist.getModel()).toArray();
}

// This method is called when a cell value is edited by the user.
/*public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row,int column)
{
mlist.setListData((Object[])value);
return mlist;
}
*/
    public Component getTableCellEditorComponent(JTable table,
                                             Object value,
                                             boolean isSelected,
                                             int row,
                                             int column) {

    DefaultListModel model = new DefaultListModel();

    Object[] items = (Object[]) value;

    for (int i = 1; i < items.length; i++) {
        model.add(i-1, items[i]);
    }

    mlist.setModel(model);

//    return mlist;

    Border scborder = new TitledBorder(BorderFactory.createEmptyBorder(), items[0].toString());
    scpane.setBorder(scborder);
    scpane.getViewport().add(mlist);

    return scpane;


}



}

class MyCellRenderer extends JList implements TableCellRenderer
{
public MyCellRenderer(){
super();
}
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[] mlist = (Object[]) value;


fold = mlist.length ;

//adjust row height
//if(mtable.getRowHeight(rowIndex)!=fold*rowHight) //otherwise, the save dialog couldn't show normally
//mtable.setRowHeight(rowIndex, fold*rowHight);
//mtable.setRowHeight(rowIndex, mtable.getHeight()/mtable.getRowCount());
    mtable.setRowHeight(rowIndex, 70);


//setListData((Object[])value);
   JList jlist = new JList();
   JScrollPane scpane = new JScrollPane();
   DefaultListModel model = new DefaultListModel();
   for (int i = 1; i < mlist.length; i++) {
       model.add(i-1, mlist[i]);
   }

   jlist.setModel(model);
   Border scborder = new TitledBorder(BorderFactory.createEmptyBorder(), mlist[0].toString());
   scpane.setBorder(scborder);
   scpane.getViewport().add(jlist);

   return scpane;

    

//return this;
}
}



с одной стороны работает, но реализовано херово, занимает 99%процессорного времени

как изменить getTableCellRendererComponent чтобы меньше занимало системных ресурсов?
...
Рейтинг: 0 / 0
JList как ячейка JTable
    #39342640
Rintsler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините, пытаюсь понять как пользоваться форумом. Слушайте, где вы код пишете все, я просто на какой форум не попаду не пойму, я начал работать в netbeans, и не пойму как исправить свой код, куда что вписывать?
...
Рейтинг: 0 / 0
JList как ячейка JTable
    #39342663
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RintslerИзвините, пытаюсь понять как пользоваться форумом. Слушайте, где вы код пишете все, я просто на какой форум не попаду не пойму, я начал работать в netbeans, и не пойму как исправить свой код, куда что вписывать?
Сверху есть комбобокс "SRC", ну или руками внутри тега [SRC JAVA][/SRC]
...
Рейтинг: 0 / 0
JList как ячейка JTable
    #39342667
Rintsler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL2008,

Вот это?
...
Рейтинг: 0 / 0
JList как ячейка JTable
    #39342676
Rintsler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VS я быстро понял, а остальные среды намудренные какие-то, интерфейс налепили абы как.
...
Рейтинг: 0 / 0
JList как ячейка JTable
    #39342680
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RintslerVS я быстро понял, а остальные среды намудренные какие-то, интерфейс налепили абы как.
Это Java. Тут всё так. Не только IDE.
...
Рейтинг: 0 / 0
JList как ячейка JTable
    #39342697
Rintsler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я уже просто думаю взять изучить все как пишется вручную, а не при помощи интерфейса среды, потому что как мне надо реализовать что-то по-сложнее так я в ступоре. Java недавно начал изучать, думал тоже самое что и C# =))
...
Рейтинг: 0 / 0
JList как ячейка JTable
    #39342840
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RintslerSQL2008,

Вот это?
Хм... Я имел в виду этот форум вообще-то...
Кстати, тоже совсем недавно начал изучать Java и NetBeans.
Что касается среды, то больших проблем не испытываю, хотя всю жизнь до этого работал в MS Visual Studio.
...
Рейтинг: 0 / 0
JList как ячейка JTable
    #39342850
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rintsler Java недавно начал изучать, думал тоже самое что и C# =))
Общего действительно много, зная С# разобраться можно, если конечно замены типа
Код: c#
1.
2.
3.
4.
5.
using System.IO.Text;
...
foreach(String s in strings){
...
}


на
Код: java
1.
2.
3.
4.
5.
import java.util.List;
...
for(String s : strings) {
...
}


не ставят вас в тупик.
...
Рейтинг: 0 / 0
JList как ячейка JTable
    #39345186
Rintsler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL2008,

Не ставят, мне не понятно как netbeans распределяет в себе код.
...
Рейтинг: 0 / 0
JList как ячейка JTable
    #39345244
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RintslerSQL2008,

Не ставят, мне не понятно как netbeans распределяет в себе код.
- Хватит писать фигню в теме которой уже почти 10 лет. Создайте новую тему.
- Сформулийте свои вопросы. "не понятно" это не вопрос.
- NetBeans в себе код не распределяет, по этому объяснить вам то что вы спрашиваете не возможно.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JList как ячейка JTable
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]