Привет всем, скажу сразу, что проблема решена, однако осталась невыяснена 1 деталь. Проблема была в следующем есть 2 таблицы с разным количеством колонок. Нужно, чтобы первая колонка во 2-ой таблице была размером n колонкам в 1-ой таблице. Знаю звучит просто, однако, когда дело доходит до отображения на экране в дело вступают алгоритмы компоновщиков и врезультате получается не то, что хотелось бы. вот рабочий код: Главный класс: | Код | public class Project {
/** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here Frame f=new Frame(10,15, 1, 5); } }
|
остальные классы из этого же пакета, имя пакета Project: 1. Модель таблиц 1 и 2, каждая строка представляет из себя экземпляр класса RowsModel | Код | public class Model implements TableModel { ArrayList<TableModelListener> tm=new ArrayList<>(); ArrayList<RowsModel> rows=new ArrayList<>(); public Model(int kolvoStrok,int kolvoKolonok) { for(int i=0;i<kolvoStrok;i++) rows.add(new RowsModel(kolvoKolonok)); }
@Override public int getRowCount() { return rows.size(); } @Override public int getColumnCount() { return rows.get(0).getStroka().size(); }
@Override public String getColumnName(int i) { return " "; }
@Override public Class<?> getColumnClass(int i) { return String.class; }
@Override public boolean isCellEditable(int i, int i1) { return true; }
@Override public Object getValueAt(int i, int i1) { return rows.get(i).getStroka().get(i1); }
@Override public void setValueAt(Object o, int i, int i1) { rows.get(i).getStroka().set(i1,(String)o); }
@Override public void addTableModelListener(TableModelListener tl) { tm.add(tl); }
@Override public void removeTableModelListener(TableModelListener tl) { tm.remove(tl); } }
|
2. Модель строки | Код | public class RowsModel { ArrayList<String> stroka=new ArrayList<>(); public RowsModel(int kolvoPoley) { for(int i=0;i<kolvoPoley;i++)stroka.add(""); }
public ArrayList<String> getStroka() { return stroka; } }
|
3. Панель | Код | public class Panel extends JPanel { JTable jTable1; JTable jTable2; Box b; public Panel(int kolvoStrok1,int kolvoKolonok1,int kolvoStrok2,int kolvoKolonok2) { jTable1=new JTable(new Model(kolvoStrok1, kolvoKolonok1)); jTable2=new JTable(new Model(kolvoStrok2, kolvoKolonok2)); } public void ustanovitRazmeri() { b=new Box(BoxLayout.Y_AXIS); b.add(jTable1); b.add(jTable2); TableColumnModel tcm1=jTable1.getColumnModel(); TableColumnModel tcm2=jTable2.getColumnModel(); int prefWidth=0; for(int i=0;i<tcm1.getColumnCount()-(tcm2.getColumnCount()-1);i++) { prefWidth=prefWidth+tcm1.getColumn(i).getPreferredWidth()+tcm1.getColumnMargin(); } tcm2.getColumn(0).setPreferredWidth(prefWidth); prefWidth=0; for(int i=0;i<tcm2.getColumnCount()-1;i++) { prefWidth=tcm1.getColumn(tcm1.getColumnCount()-(tcm2.getColumnCount()-1)+i).getPreferredWidth()+tcm1.getColumnMargin(); tcm2.getColumn(i+1).setPreferredWidth(prefWidth); } add(b); } }
|
4. И окно | Код | public class Frame extends JFrame { public Frame(int kolvoStrok1,int kolvoKolonok1,int kolvoStrok2,int kolvoKolonok2) { Panel p=new Panel(kolvoStrok1, kolvoKolonok1,kolvoStrok2,kolvoKolonok2); p.ustanovitRazmeri(); add(p); setSize(1680,960); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); } }
|
Это рабочий вариант, а теперь если заменить метод public void ustanovitRazmeri в Panel на : | Код | public Box ustanovitRazmeri() { b=new Box(BoxLayout.Y_AXIS); b.add(jTable1); b.add(jTable2); TableColumnModel tcm1=jTable1.getColumnModel(); TableColumnModel tcm2=jTable2.getColumnModel(); int prefWidth=0; for(int i=0;i<tcm1.getColumnCount()-(tcm2.getColumnCount()-1);i++) { prefWidth=prefWidth+tcm1.getColumn(i).getPreferredWidth()+tcm1.getColumnMargin(); } tcm2.getColumn(0).setPreferredWidth(prefWidth); prefWidth=0; for(int i=0;i<tcm2.getColumnCount()-1;i++) { prefWidth=tcm1.getColumn(tcm1.getColumnCount()-(tcm2.getColumnCount()-1)+i).getPreferredWidth()+tcm1.getColumnMargin(); tcm2.getColumn(i+1).setPreferredWidth(prefWidth); } return b; } }
|
И во Frame соответственно | Код | public class Frame extends JFrame { public Frame(int kolvoStrok1,int kolvoKolonok1,int kolvoStrok2,int kolvoKolonok2) { Panel p=new Panel(kolvoStrok1, kolvoKolonok1,kolvoStrok2,kolvoKolonok2); add(p.ustanovitRazmeri()); setSize(1680,960); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); } }
|
И в итоге получается не то, что надо. Вопрос что происходит и почему? У меня есть догадки, мысли, но точного ответа нет. Пожалуйста, кто знает в чём соль поделитесь, заранее спасибо.
|