Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с компоновщиками 
:(
    Опции темы
enzaime
Дата 16.8.2013, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 16.8.2013

Репутация: нет
Всего: нет



Привет всем, скажу сразу, что проблема решена, однако осталась невыяснена 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); 
       
    }
}

И в итоге получается не то, что надо. 
Вопрос что происходит и почему? У меня есть догадки, мысли, но точного ответа нет.
Пожалуйста, кто знает в чём соль поделитесь, заранее спасибо.



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0406 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.