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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Строки переменной ширины в JTable 
:(
    Опции темы
PovAnd
Дата 29.10.2009, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Может кто покажет надежную имплементацию?

(Нужны чтобы в зависимости от вводимого в ячейку текста размер всей строки по высоте(ширине)  таблицы изменялся, т.е. чтобы весь текст был виден. )

Это сообщение отредактировал(а) PovAnd - 29.10.2009, 15:54
PM MAIL   Вверх
dorogoyIV
Дата 29.10.2009, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

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



Цитата(PovAnd @  29.10.2009,  14:04 Найти цитируемый пост)
(Нужны чтобы в зависимости от вводимого в ячейку текста размер всей строки  таблицы изменялся, т.е. чтобы весь текст был виден. )

может быть ты имел ввиду - изменять ширину столбца?
тогда вот:
Код

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;

public class Test extends JFrame
                  implements TableModelListener
{
 JTable table = new JTable(10, 5);

 public Test()
 {
  add(new JScrollPane(table));
  table.getModel().addTableModelListener(this);
  table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 }

 public void tableChanged(TableModelEvent e)
 {
  setColumnPreferredWidth(table.getSelectedRow(),
                          table.getSelectedColumn());
 }

 private void setColumnPreferredWidth(int row, int column)
 {
  TableColumn col = table.getColumnModel().getColumn(column);
  int width = col.getWidth();

  if(width < getTextWidth(row, column))
   col.setPreferredWidth(getTextWidth(row, column) + 10);
 }

 private int getTextWidth(int row, int column)
 {
  String text = table.getValueAt(row, column).toString();
  FontMetrics fm = table.getFontMetrics(table.getFont());
  return fm.stringWidth(text);
 }

 public static void main(String [] args)
 {
  JFrame f = new Test();
  f.setBounds(100, 100, 400, 300);
  f.setDefaultCloseOperation(3);
  f.setVisible(true);
 }
}

PM MAIL   Вверх
PovAnd
Дата 29.10.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не. Нужно что-то типа такого:


Код

package com.agilemind.commons.localization.views;

import javax.swing.AbstractCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.tree.TreeCellEditor;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.io.Serializable;
import java.util.EventObject;

public class Test extends JFrame {
    JTable table = new JTable(10, 5);

    public Test() {
        for (int i = 0; i < table.getColumnCount(); i++) {
            TableColumn tableColumn = table.getColumnModel().getColumn(i);
            tableColumn.setCellEditor(new MyCellEditor(new JEditorPane(), table, tableColumn));
        }
        add(new JScrollPane(table));
    }

    public static void main(String[] args) {
        JFrame f = new Test();
        f.setBounds(100, 100, 400, 300);
        f.setDefaultCloseOperation(3);
        f.setVisible(true);
    }


    static class MyCellEditor extends AbstractCellEditor
            implements TableCellEditor, TreeCellEditor {

//
//  Instance Variables
//

        /**
         * The Swing component being edited.
         */
        protected JComponent editorComponent;
        /**
         * The delegate class which handles all methods sent from the
         * <code>CellEditor</code>.
         */
        protected EditorDelegate delegate;
        /**
         * An integer specifying the number of clicks needed to start editing.
         * Even if <code>clickCountToStart</code> is defined as zero, it
         * will not initiate until a click occurs.
         */
        protected int clickCountToStart = 1;

//
//  Constructors
//

        /**
         * Constructs a <code>DefaultCellEditor</code> that uses a text field.
         *
         * @param editorPane a <code>JTextField</code> object
         */
        public MyCellEditor(final JEditorPane editorPane, final JTable table, final TableColumn tableColumn/*, final Object columnIdentifier*/) {
            editorComponent = editorPane;
            this.clickCountToStart = 2;
            delegate = new EditorDelegate() {
                public void setValue(Object value) {
                    editorPane.setText((value != null) ? value.toString() : "");
                }

                public Object getCellEditorValue() {
                    return editorPane.getText();
                }
            };
            editorPane.addKeyListener(delegate);

            //TableColumn tableColumn = table.getColumn(columnIdentifier);
            Dimension dimension = new Dimension(tableColumn.getPreferredWidth(), 500);
            editorPane.setPreferredSize(dimension);
            editorPane.setSize(dimension);

            editorPane.getDocument().addDocumentListener(new DocumentListener() {
                public void insertUpdate(DocumentEvent e) {
                    updateTableRowHeight();
                }

                public void removeUpdate(DocumentEvent e) {
                    updateTableRowHeight();
                }

                public void changedUpdate(DocumentEvent e) {
                    updateTableRowHeight();
                }

                private void updateTableRowHeight() {

                    FontMetrics fontMetrics = editorPane.getFontMetrics(editorPane.getFont());
                    double textWidth = fontMetrics.stringWidth(editorPane.getText()) + fontMetrics.stringWidth("w");
                    double textHeight = fontMetrics.getHeight();
                    //double componentWidth = table.getColumn(columnIdentifier).getWidth();
                    double componentWidth = tableColumn.getWidth();

                    double componentHeight = (textWidth * textHeight) / componentWidth;
                    int n = (int) (componentHeight / textHeight) + 1;


                    if (componentHeight != 0) {
                        table.setRowHeight(table.getSelectedRow(), (int) (n * textHeight));
                    } else {
                        //todo...
                    }
                }
            });
        }

        /**
         * Returns a reference to the editor component.
         *
         * @return the editor <code>Component</code>
         */
        public Component getComponent() {
            return editorComponent;
        }

//
//  Modifying
//

        /**
         * Specifies the number of clicks needed to start editing.
         *
         * @param count an int specifying the number of clicks needed to start editing
         * @see #getClickCountToStart
         */
        public void setClickCountToStart(int count) {
            clickCountToStart = count;
        }

        /**
         * Returns the number of clicks needed to start editing.
         *
         * @return the number of clicks needed to start editing
         */
        public int getClickCountToStart() {
            return clickCountToStart;
        }

//
//  Override the implementations of the superclass, forwarding all methods
//  from the CellEditor interface to our delegate.
//

        /**
         * Forwards the message from the <code>CellEditor</code> to
         * the <code>delegate</code>.
         *
         * @see EditorDelegate#getCellEditorValue
         */
        public Object getCellEditorValue() {
            return delegate.getCellEditorValue();
        }

        /**
         * Forwards the message from the <code>CellEditor</code> to
         * the <code>delegate</code>.
         *
         * @see EditorDelegate#isCellEditable(java.util.EventObject)
         */
        public boolean isCellEditable(EventObject anEvent) {
            return delegate.isCellEditable(anEvent);
        }

        /**
         * Forwards the message from the <code>CellEditor</code> to
         * the <code>delegate</code>.
         *
         * @see EditorDelegate#shouldSelectCell(EventObject)
         */
        public boolean shouldSelectCell(EventObject anEvent) {
            return delegate.shouldSelectCell(anEvent);
        }

        /**
         * Forwards the message from the <code>CellEditor</code> to
         * the <code>delegate</code>.
         *
         * @see EditorDelegate#stopCellEditing
         */
        public boolean stopCellEditing() {
            return delegate.stopCellEditing();
        }

        /**
         * Forwards the message from the <code>CellEditor</code> to
         * the <code>delegate</code>.
         *
         * @see EditorDelegate#cancelCellEditing
         */
        public void cancelCellEditing() {
            delegate.cancelCellEditing();
        }

//
//  Implementing the TreeCellEditor Interface
//

        /**
         * Implements the <code>TreeCellEditor</code> interface.
         */
        public Component getTreeCellEditorComponent(JTree tree, Object value,
                                                    boolean isSelected,
                                                    boolean expanded,
                                                    boolean leaf, int row) {
            String stringValue = tree.convertValueToText(value, isSelected,
                    expanded, leaf, row, false);

            delegate.setValue(stringValue);
            return editorComponent;
        }

//

        //  Implementing the CellEditor Interface

        //

        /**
         * Implements the <code>TableCellEditor</code> interface.
         */
        public Component getTableCellEditorComponent(JTable table, Object value,
                                                     boolean isSelected,
                                                     int row, int column) {
            delegate.setValue(value);
            if (editorComponent instanceof JCheckBox) {
                //in order to avoid a "flashing" effect when clicking a checkbox
                //in a table, it is important for the editor to have as a border
                //the same border that the renderer has, and have as the background
                //the same color as the renderer has. This is primarily only
                //needed for JCheckBox since this editor doesn't fill all the
                //visual space of the table cell, unlike a text field.
                TableCellRenderer renderer = table.getCellRenderer(row, column);
                Component c = renderer.getTableCellRendererComponent(table, value,
                        isSelected, true, row, column);
                if (c != null) {
                    editorComponent.setOpaque(true);
                    editorComponent.setBackground(c.getBackground());
                    if (c instanceof JComponent) {
                        editorComponent.setBorder(((JComponent) c).getBorder());
                    }
                } else {
                    editorComponent.setOpaque(false);
                }
            }
            return editorComponent;
        }


//
//  Protected EditorDelegate class
//

        /**
         * The protected <code>EditorDelegate</code> class.
         */
        protected class EditorDelegate extends KeyAdapter implements Serializable {

            /**
             * The value of this cell.
             */
            protected Object value;

            /**
             * Returns the value of this cell.
             *
             * @return the value of this cell
             */
            public Object getCellEditorValue() {
                return value;
            }

            /**
             * Sets the value of this cell.
             *
             * @param value the new value of this cell
             */
            public void setValue(Object value) {
                this.value = value;
            }

            /**
             * Returns true if <code>anEvent</code> is <b>not</b> a
             * <code>MouseEvent</code>.  Otherwise, it returns true
             * if the necessary number of clicks have occurred, and
             * returns false otherwise.
             *
             * @param anEvent the event
             * @return true  if cell is ready for editing, false otherwise
             * @see #shouldSelectCell
             */
            public boolean isCellEditable(EventObject anEvent) {
                if (anEvent instanceof MouseEvent) {
                    return ((MouseEvent) anEvent).getClickCount() >= clickCountToStart;
                }
                return true;
            }

            /**
             * Returns true to indicate that the editing cell may
             * be selected.
             *
             * @param anEvent the event
             * @return true
             * @see #isCellEditable
             */
            public boolean shouldSelectCell(EventObject anEvent) {
                return true;
            }

            /**
             * Returns true to indicate that editing has begun.
             *
             * @param anEvent the event
             */
            public boolean startCellEditing(EventObject anEvent) {
                return true;
            }

            /**
             * Stops editing and
             * returns true to indicate that editing has stopped.
             * This method calls <code>fireEditingStopped</code>.
             *
             * @return true
             */
            public boolean stopCellEditing() {
                fireEditingStopped();
                return true;
            }

            /**
             * Cancels editing.  This method calls <code>fireEditingCanceled</code>.
             */
            public void cancelCellEditing() {
                fireEditingCanceled();
            }

            @Override
            public void keyReleased(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    MyCellEditor.this.stopCellEditing();
                } else if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    cancelCellEditing();
                }
            }
        }

    } // End of class JCellEditor
}


Просто такая реализация не катит, то что она глючит когда ввести много строк, надо как-то по правильному рассчитать размеры текста, а я блин не математик :( . Сори за непонятки

Это сообщение отредактировал(а) PovAnd - 29.10.2009, 15:53
PM MAIL   Вверх
dorogoyIV
Дата 3.11.2009, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

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



я ждал - когда же ты исправишь вопрос свой  smile 
все таки высота строки?  smile (или ширина)
да ладно...

короче надо делать свой рендерер: (ну примерно так должно получиться)
Код

import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.*;
import java.io.Serializable;
import java.util.*;

public class Test2 extends JFrame
{
 JTable table = new JTable(10, 5);

 public Test2()
 {
  for (int i = 0; i < table.getColumnCount(); i++)
  {
   TableColumn tableColumn = table.getColumnModel().getColumn(i);
   tableColumn.setCellEditor(new MyCellEditor(new JEditorPane(),
                  table, tableColumn));
   tableColumn.setCellRenderer(new MyRenderer());
  }
  table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
  add(new JScrollPane(table));
 }

 public static void main(String[] args)
 {
  JFrame f = new Test2();
  f.setBounds(100, 100, 400, 300);
  f.setDefaultCloseOperation(3);
  f.setVisible(true);
 }

 static class MyCellEditor extends AbstractCellEditor
 implements TableCellEditor, TreeCellEditor
 {
  protected JComponent editorComponent;
  protected EditorDelegate delegate;
  protected int clickCountToStart = 1;

  public MyCellEditor(final JEditorPane editorPane, final JTable table,
                                             final TableColumn tableColumn)
  {
   editorComponent = editorPane;
   this.clickCountToStart = 2;
   delegate = new EditorDelegate()
   {
    public void setValue(Object value)
    {
     editorPane.setText((value != null) ? value.toString() : "");
    }
    public Object getCellEditorValue()
    {
     return editorPane.getText();
    }
   };

   editorPane.addKeyListener(delegate);
   Dimension dimension = new Dimension(tableColumn.getPreferredWidth(), 500);
   editorPane.setPreferredSize(dimension);
   editorPane.setSize(dimension);

   editorPane.getDocument().addDocumentListener(new DocumentListener()
   {
    public void insertUpdate(DocumentEvent e)
    {
     updateTableRowHeight();
    }
    public void removeUpdate(DocumentEvent e)
    {
     updateTableRowHeight();
    }
    public void changedUpdate(DocumentEvent e)
    {
     updateTableRowHeight();
    }
    private void updateTableRowHeight()
    {
     FontMetrics fontMetrics = editorPane.getFontMetrics(editorPane.getFont());
     double textWidth = fontMetrics.stringWidth(editorPane.getText()) + fontMetrics.stringWidth("w");
     double textHeight = fontMetrics.getHeight();
     double componentWidth = tableColumn.getWidth();
     double componentHeight = (textWidth * textHeight) / componentWidth;
     int n = (int) (componentHeight / textHeight) + 1;

     if (componentHeight != 0)
      table.setRowHeight(table.getSelectedRow(), (int) (n * textHeight));
    }
   });
  }

  public Component getComponent()
  {
   return editorComponent;
  }

  public void setClickCountToStart(int count)
  {
   clickCountToStart = count;
  }

  public int getClickCountToStart()
  {
   return clickCountToStart;
  }

  public Object getCellEditorValue()
  {
   return delegate.getCellEditorValue();
  }

  public boolean isCellEditable(EventObject anEvent)
  {
   return delegate.isCellEditable(anEvent);
  }

  public boolean shouldSelectCell(EventObject anEvent)
  {
   return delegate.shouldSelectCell(anEvent);
  }

  public boolean stopCellEditing()
  {
   return delegate.stopCellEditing();
  }

  public void cancelCellEditing()
  {
   delegate.cancelCellEditing();
  }

  public Component getTreeCellEditorComponent(JTree tree, Object value,
           boolean isSelected, boolean expanded, boolean leaf, int row)
  {
   String stringValue = tree.convertValueToText(value, isSelected,
   expanded, leaf, row, false);
   delegate.setValue(stringValue);
   return editorComponent;
  }

  public Component getTableCellEditorComponent(JTable table, Object value,
         boolean isSelected, int row, int column)
  {
   delegate.setValue(value);

   if (editorComponent instanceof JCheckBox)
   {
    TableCellRenderer renderer = table.getCellRenderer(row, column);
    Component c = renderer.getTableCellRendererComponent(table, value,
                                          isSelected, true, row, column);
    if (c != null)
    {
     editorComponent.setOpaque(true);
     editorComponent.setBackground(c.getBackground());

     if (c instanceof JComponent)
      editorComponent.setBorder(((JComponent) c).getBorder());
    }
    else
     editorComponent.setOpaque(false);
   }
   return editorComponent;
  }

  protected class EditorDelegate extends KeyAdapter implements Serializable
  {
   protected Object value;

   public Object getCellEditorValue()
   {
    return value;
   }

   public void setValue(Object value)
   {
    this.value = value;
   }

   public boolean isCellEditable(EventObject anEvent)
   {
    if (anEvent instanceof MouseEvent)
     return ((MouseEvent) anEvent).getClickCount() >= clickCountToStart;

    return true;
   }

   public boolean shouldSelectCell(EventObject anEvent)
   {
    return true;
   }

   public boolean startCellEditing(EventObject anEvent)
   {
    return true;
   }

   public boolean stopCellEditing()
   {
    fireEditingStopped();
    return true;
   }

   public void cancelCellEditing()
   {
    fireEditingCanceled();
   }

   public void keyReleased(KeyEvent e)
   {
    if (e.getKeyCode() == KeyEvent.VK_ENTER)
     MyCellEditor.this.stopCellEditing();

    else if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
     cancelCellEditing();
   }
  }
 }
}

class MyRenderer extends JEditorPane
                 implements TableCellRenderer
{
 public Component getTableCellRendererComponent(JTable table, Object value,
                 boolean isSelected, boolean hasFocus, int row, int column)
 {
  setBorder(hasFocus ? new LineBorder(Color.BLUE) : null);
  setText(value != null ? value.toString() : "");
  return this;
 }
}


PM MAIL   Вверх
filipp76
Дата 9.1.2012, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 4.4.2007
Где: Украина, Киев

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



dorogoyIV, почему-то ваш пример применимо к моей таблице не работает ( вообще ничего не поменялось кроме выделения синим цвета ячейки при ее выборе, текст как не влазил в ячейку так и не влазит (. Может я что-то не так делаю, скопировал два ваших класа и:

Код

  for (int i = 0; i < jTabWorks.getColumnCount(); i++)
  {
   TableColumn tableColumn = jTabWorks.getColumnModel().getColumn(i);
   tableColumn.setCellEditor(new MyCellEditor(new JEditorPane(),jTabWorks, tableColumn));
   tableColumn.setCellRenderer(new MyRenderer());
  }


Вставляю этот код в конце после присваивания TableModel.

Это сообщение отредактировал(а) filipp76 - 9.1.2012, 11:25
PM MAIL WWW ICQ   Вверх
dorogoyIV
Дата 9.1.2012, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

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



user posted image
PM MAIL   Вверх
filipp76
Дата 9.1.2012, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 4.4.2007
Где: Украина, Киев

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



В чем же может быть проблема ? (
PM MAIL WWW ICQ   Вверх
filipp76
Дата 9.1.2012, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 4.4.2007
Где: Украина, Киев

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



Сори протупил все работает но не совсем как мне надо, у меня данные выводятся в таблицу, а не вводятся руками и ячейки у меня не редактируемые, как мне сделать так чтоб после вывода данных в таблицу она автоматически подстроила высоту строки ? и еще очень важно мне надо применять это только к второму столбцу. Заранее спасибо.

Понял что надо в MyCellEditor правильный Listener добавит который отловит обновление / добавление данных, но какой и к чему его прикрутить не могу найти.

Это сообщение отредактировал(а) filipp76 - 9.1.2012, 13:19
PM MAIL WWW ICQ   Вверх
dorogoyIV
Дата 9.1.2012, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

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



Цитата(filipp76 @  9.1.2012,  13:01 Найти цитируемый пост)
как мне сделать так чтоб после вывода данных в таблицу она автоматически подстроила высоту строки ?

строка 79 
Код

private void updateTableRowHeight()
...
только строку получишь не так: table.getSelectedRow()


Цитата(filipp76 @  9.1.2012,  13:01 Найти цитируемый пост)
мне надо применять это только к второму столбцу

Код

TableColumn tableColumn = table.getColumnModel().getColumn(2);
tableColumn.setCellEditor(new MyCellEditor(new JEditorPane(), table, tableColumn));

PM MAIL   Вверх
filipp76
Дата 9.1.2012, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 4.4.2007
Где: Украина, Киев

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



Цитата(dorogoyIV @ 9.1.2012,  13:16)
Цитата(filipp76 @  9.1.2012,  13:01 Найти цитируемый пост)
как мне сделать так чтоб после вывода данных в таблицу она автоматически подстроила высоту строки ?

строка 79 
Код

private void updateTableRowHeight()
...

Все равно не понял, у вас функция запускается из листенера по событию, куда именно в коде вставить updateTableRowHeight() чтоб она выполнялась сразу ? И пользователь у меня нчиего не выбирает, задача загрузить данные в таблицу и сделать их нормально читаемыми, конкретно в 2й колонке длинная строка.

И еще на этой строке - table.getSelectedRow() вылетает ошибка, насколько я понял из-за того что никаких строк не выбрано smile (Я просто вытащил код из updateTableRowHeight и поставил его перед листенером ).

Это сообщение отредактировал(а) filipp76 - 9.1.2012, 17:10
PM MAIL WWW ICQ   Вверх
filipp76
Дата 9.1.2012, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 4.4.2007
Где: Украина, Киев

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



Затык конкретно в строке:
Код

 table.setRowHeight(table.getSelectedRow(), (int) (n * textHeight));


Не могу понять что подставить вместо - table.getSelectedRow() , ведь у меня ничего не выбрано и строк много и разных.
PM MAIL WWW ICQ   Вверх
filipp76
Дата 9.1.2012, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 4.4.2007
Где: Украина, Киев

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



В итоге не парился, повесил этот код:

Код

for (int ii=0;ii<jTabWorks.getRowCount();ii++){
        FontMetrics fontMetrics = jTabWorks.getFontMetrics(jTabWorks.getFont());
        double textWidth = fontMetrics.stringWidth(jTabWorks.getModel().getValueAt(ii, 1).toString()) + fontMetrics.stringWidth("w");
        double textHeight = fontMetrics.getHeight();
        double componentWidth = jTabWorks.getColumnModel().getColumn(1).getWidth();
        double componentHeight = (textWidth * textHeight) / componentWidth;
        int n = (int) (componentHeight / textHeight) + 1;
        if (componentHeight != 0)
        jTabWorks.setRowHeight(ii, ((int) (n * textHeight)) + 2);
        } 
        
     jTabWorks.getColumnModel().getColumn(1).setCellRenderer(new MyRenderer());


где надо и все работает, только подкрутил немного MyRenderer чтоб он не отличался от остальной части таблицы.

Но ! (куда же без него) есть одна странность, я заполняю таблицу и после этого выполняю указанный выше код, при этом ширина строк выставляется совсем не корректная (например строка влазит, а высота раза в 2 больше), но такой же код я повесил в листенер изменения ширины колонки и при этом все идеально !! В чем может быть проблема ?

Сравнил что не так, у меня почему-то componentWidth и componentHeight сильно отличаются можно сказать в одинаковых условиях:
1. Я таблице присваиваю TableModel и вызываю выше указанный код, результат в итоге неправильный.
2. Я меняю ширину стобца в уже заполненной таблице, срабатывает листенер MouseReleased в которой вписан выше указанный код и все работает правильно, строки переносятся идеально.

Убейте не могу понять в чем разница (

Вот в чем проблема:

Код

newCmodel.getColumn(count).setPreferredWidth(Integer.valueOf(numS));
jTabMain.setColumnModel(newCmodel);


Так я присваиваю нужную мне ширину каждого столбца. После этого получаю еще раз ширину столбца:

Код

int kk = jTabMain.getColumnModel().getColumn(1).getWidth();


И вот тут лажа, возвращает значение которое было до моего присваивания, НО на экране все изменяется !! Как сказать ей что она дура (TableColumnModel) и ширина столбцов уже другая ???

Есть тупое решение при установке ширины столбцов дублировать эти данные в глобальную переменную и брать всегда оттуда, но это же тупо !

Это сообщение отредактировал(а) filipp76 - 10.1.2012, 00:57
PM MAIL WWW ICQ   Вверх
filipp76
Дата 10.1.2012, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 4.4.2007
Где: Украина, Киев

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



Нашел в чем проблема, теперь все супер, надо не так:

Код

jTabMain.getColumnModel().getColumn(1).getWidth();


а так:

Код

jTabMain.getColumnModel().getColumn(1).getPreferredWidth();

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

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

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


 




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


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

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