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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заголовок таблицы из 2 строк, Таблица+бд 
:(
    Опции темы
izver84
Дата 4.4.2008, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Здрасти.Такой  вопрос. jTable стоит на jScrollPanel. Данные берутся из таблицы. Нужно чтобы Таблица имела такой вид.
------------------------------------------------------------------------------------------------------------------
|       Потребитель                |           Плательщик                   |    Банк                  |
------------------------------------------------------------------------------------------------------------------
|Код1   |    Наименование1  |    Код2   |    Р/счет    |     Ф/счет   | Наименование2  |    Адрес  |
-------------------------------------------------------------------------------------------------------------------
|6004   |    Samsung             |    6005   |    5224215 | 55441    |  СоцБанк             |  Кукуево |
--------------------------------------------------------------------------------------------------------------------
Вот класс Модели
Код

package sbit;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Vector;
import javax.swing.table.AbstractTableModel;

public class database extends AbstractTableModel{
    private static final long serialVersionUID = 1L;
    public String[] columnNames;
    public String[] dbcolumnNames;
    public Vector rows = new Vector();
    public ResultSetMetaData metaData;
    public Statement statement;
    public ResultSet resultSet;
    public Connection con; 
    public String tableName;
    
    public int getColumnCount()
    {
      return columnNames.length;
    }

    public String getColumnName(int n)
    {
        
      return columnNames[n];
    }
    public String getDBColumnName(int n)
    {
        
          return dbcolumnNames[n];
    }
    public int getDBColumnCount()
    {
      return dbcolumnNames.length;
    }
    
    public int getRowCount()
    {
        return rows.size();
    }
    public int addRow()
    {

        int r=rows.size()+1;
        return r;
    }

    public Object getValueAt(int aRow, int aColumn)
    {
        Vector row = (Vector)rows.elementAt(aRow);
        
        return row.elementAt(aColumn);
    }
//-----------------------------------------------------------------------------------------------
    public database(String query, String DBNAME, String USERNAME, String PASSWORD, String tableName, String tableName1, String tableName2,String[] columnNames)
    {
       
        this.columnNames = columnNames; 
        this.tableName = tableName;
        fireTableDataChanged();
        @SuppressWarnings("unused")
        Driver d;
        try{
            d = (Driver)Class.forName("org.postgresql.Driver").newInstance();
        }
        catch (Exception e) {
            System.out.println("Error 1");
            System.out.println(e.getStackTrace());
        }
        try{
            con = DriverManager.getConnection
                ("jdbc:postgresql://192.168.4.164:5432/"+DBNAME,USERNAME,PASSWORD);
ResultSet.CONCUR_UPDATABLE);

        statement = con.createStatement();
        SqlReload(query);
        }
        catch(SQLException e)
        {
            System.out.println(e.getMessage());
        }
    }
    
//---------------------------------------------------------------------------------------------
    public boolean isCellEditable(int row, int column)
    {
        try
        {
          return metaData.isWritable(column+1);
        }
        catch (SQLException e)
        {
          return false;
        }
          // return true;
    }
//--------------------------------------------------------------------------------------------
    public void setValueAt(Object value, int row, int column)
    {
      try
        {
          String columnName = dbcolumnNames[column];

         String query =
            "UPDATE "+tableName+
            " SET "+columnName+" = "+
             dbRepresentation(column, value)+
            " WHERE ";
        
        for(int col = 0; col < getColumnCount();col++)
        {
          
          String colName = getDBColumnName(col);

          if (colName==columnName)
           {
            continue;
           }
                          if (col != 0)
                           {
                             query = query + " and ";
                            }
                             query = query + colName +" = "+
                             dbRepresentation(col, getValueAt(row, col));
           }
        PreparedStatement pstmt =
        con.prepareStatement(query);
        pstmt.executeUpdate();
        Object val;
        val = tbRepresentation(column,value);
        Vector dataRow = (Vector)rows.elementAt(row);
        dataRow.setElementAt(val, column);
        fireTableDataChanged();
        
        fireTableCellUpdated(row,column);
        }
        catch (Exception ex)
        {
           System.err.println(ex);
        }
    }
    

//-------------------------------------------------------------------------------------------    
    public Object dbRepresentation(int column, Object value) throws NumberFormatException
    {
        Object val;
        int type;
        if (value == null)
        {
            return "null";
        }
        try
        {            
           type = metaData.getColumnType(column+1);
        }
        catch (SQLException e)
        {
          return value.toString();
        }
        
        
        switch(type)
        {
            case Types.BIGINT:
                return val = new Long(value.toString().trim());
            case Types.CHAR:
                     return val = "'"+new String(value.toString().trim())+"'";
            case Types.TINYINT:
            case Types.SMALLINT:
            case Types.INTEGER:
                return val = new Integer(value.toString().trim());
            
            case Types.REAL:
            case Types.FLOAT:
            case Types.DOUBLE:
            case Types.NUMERIC:
                return val = new Double(value.toString().trim());
            
            default: return val = "'"+new String(value.toString().trim())+"'";
        }
     }
    //---------------------------------------------------------------------------------------
    public Object tbRepresentation(int column, Object value)   throws NumberFormatException
    {
        @SuppressWarnings("unused")
        Object val;
        int type;
        if (value == null)
         {   return "null";   }
      try
       { type = metaData.getColumnType(column+1); }
      catch (SQLException e) {   return value.toString().trim(); }

      switch(type)
       {
         case Types.BIGINT:
               return val = new Long(value.toString().trim());
         case Types.TINYINT:
         case Types.SMALLINT:
         case Types.INTEGER:
              return val = new Integer(value.toString().trim());
         case Types.REAL:
         case Types.FLOAT:
         case Types.DOUBLE:
         case Types.NUMERIC:     
               return val = new Double(value.toString().trim());
         default: return val = new String(value.toString());
               
        }
    }
    //---------------------------------------------------------------------------------------

    public void SqlReload(String query)
    {
     try{
         fireTableDataChanged();
                resultSet = statement.executeQuery(query);
                metaData = resultSet.getMetaData();
                int numberOfColumns =  metaData.getColumnCount();
                dbcolumnNames = new String[numberOfColumns];
                for(int column = 1; column <= numberOfColumns; column++)
                {
                    dbcolumnNames[column-1] =
                    metaData.getColumnName(column);
                }
                rows = new Vector();
                while (resultSet.next())
                {
                   Vector newRow = new Vector();
                    for (int i = 1; i <=  getColumnCount(); i++)
                    {
                      newRow.addElement(resultSet.getObject(i));
                    }
                    
                    rows.addElement(newRow);
                }
     }
     catch(SQLException e)
        {
            System.out.println(e.getMessage());
        }
    }
//----------------------------------------------------------------------------------------
    public void SqlInsert(String query,String query1)
    {
            try{
                PreparedStatement pstmt =
                    con.prepareStatement(query);
                    pstmt.executeUpdate();
                   SqlReload(query1);
                }
        catch(SQLException e)
        {
            System.out.println(e.getMessage());
        }
    }
//******************************************************************************************    
    
    public void Sql(String query1)
    {
            try{
                PreparedStatement pstmt =
                    con.prepareStatement(query1);
                    pstmt.executeUpdate();
                }
        catch(SQLException e)
        {
            System.out.println(e.getMessage());
        }
    }
  //---------------------------------------------------------------------------------------
    public void SqlDelete(String query,String query1,int cur_row)
    {
            try{   
                String query_=query;
                query_= query_ + tbRepresentation(0, getValueAt(cur_row, 0));
                fireTableDataChanged();
                PreparedStatement pstmt = con.prepareStatement(query_);
            
                  System.out.println(query_);
                
                pstmt.executeUpdate();
                
              SqlReload(query1);
            }
        catch(SQLException e)
        {
            System.out.println(e.getMessage());
        }
    }
  //---------------------------------------------------------------------------------------    
    
     public void fireTableRowsDeleted(int firstRow, int lastRow) {
          }
     public void fireTableRowsInserted(int firstRow, int lastRow) {
          }    
    
    
//------------------------------------------------------
}



Добавлено через 2 минуты и 5 секунд
и сам класс реализации
Код


    private JTable getJTable() {
        if (jTable == null) {
            jTable = new JTable();
            jTable.setShowGrid(true);
            jTable.setCellSelectionEnabled(true);
            jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            jTable.setColumnSelectionAllowed(true);
            jTable.setModel(getDB());
            jTable.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
            jTable.getColumnModel().getColumn(0).setPreferredWidth(4);
            jTable.getColumnModel().getColumn(1).setPreferredWidth(140);
            jTable.getColumnModel().getColumn(2).setPreferredWidth(20);
            jTable.getColumnModel().getColumn(3).setPreferredWidth(90);
            jTable.getColumnModel().getColumn(4).setPreferredWidth(130);
            jTable.getColumnModel().getColumn(5).setPreferredWidth(40);
            jTable.getColumnModel().getColumn(6).setPreferredWidth(250);
            
        }
        return jTable;
    }

    private database getDB() {
        if (DB == null) {
            DB = new database(
                    "SELECT   s_potr.kpot,s_potr.npot, s_contragent.kpl, s_contragent.rs,s_contragent.fk,s_bank.mfo,s_bank.nbank FROM s_potr INNER JOIN s_contragent ON (s_potr.kpl = s_contragent.kpl) INNER JOIN s_bank ON (s_contragent.mfo = s_bank.mfo) order by s_potr.kpot",
                    "cbit", "postgres", "syrus", "s_potr","s_contragent","s_bank",new  String[]{"Код","Наименование","Код","Р/Счет","Ф/Код","Код","Наименование"});
        }
        return DB;
    }

    private JScrollPane getJScrollPane() {
        if (jScrollPane == null) {
            jScrollPane = new JScrollPane();
            jScrollPane.setViewportView(getJTable());
        }
        return jScrollPane;
    }
    }  


Нижниий ряд заголовка уже есть.

Код

private database getDB() {
        if (DB == null) {
            DB = new database(
                    "SELECT   s_potr.kpot,s_potr.npot, s_contragent.kpl, s_contragent.rs,s_contragent.fk,s_bank.mfo,s_bank.nbank FROM s_potr INNER JOIN s_contragent ON (s_potr.kpl = s_contragent.kpl) INNER JOIN s_bank ON (s_contragent.mfo = s_bank.mfo) order by s_potr.kpot",
                    "cbit", "postgres", "syrus", "s_potr","s_contragent","s_bank",new  String[]{"Код","Наименование","Код","Р/Счет","Ф/Код","Код","Наименование"});
        }
        return DB;
    }



можно ли изменить
new  String[]{} на new  String[][]{}


--------------------
Если новая программа с первого раза компилируется без ошибок, значит, она написана принципиально неправильно. 
PM MAIL   Вверх
AlexeyVorotnikov
Дата 4.4.2008, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нельзя. У JTable может быть только однострочный заголовок.


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
izver84
Дата 4.4.2008, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот нашел пример решения Пример таблицы
Менее геморойный вариант есть?  smile 


--------------------
Если новая программа с первого раза компилируется без ошибок, значит, она написана принципиально неправильно. 
PM MAIL   Вверх
math64
Дата 4.4.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Это добавление номеров строк, а не многострочный заголовок.
Я делал применрно так как в теме "Without Swing html". Высоту заголовка нужно сделать в два раза выше чем обычно, толщину вертикальных линий между ячейками - 0
PM   Вверх
izver84
Дата 4.4.2008, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(math64 @  4.4.2008,  11:24 Найти цитируемый пост)
Это добавление номеров строк, а не многострочный заголовок.

Мда!
И че это значит?

Вот так должно быть.


Это сообщение отредактировал(а) izver84 - 4.4.2008, 11:53

Присоединённый файл ( Кол-во скачиваний: 24 )
Присоединённый файл  untitled2.JPG 85,76 Kb


--------------------
Если новая программа с первого раза компилируется без ошибок, значит, она написана принципиально неправильно. 
PM MAIL   Вверх
skif18
Дата 4.4.2008, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(math64 @ 4.4.2008,  09:24)
Это добавление номеров строк, а не многострочный заголовок.

Что ты этой фразой имел ввиду? Что добавляются номера строк в таблице, а не в заголовке?


--------------------

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


Эксперт
****


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

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



Я посмотрел только на первый пример, второго не заметил
Вот так остаются лишние  пиксели между строками заголовков:
Код

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

public class ComplexHeader {
  public static void main(String[] args) {
    String[][] data = {{"1","2","3","4"},{"5","6","7","8"}};
    String[] cols = {"C1","C2","C3","C4"};
    JFrame frame = new JFrame("ComplexHeaderTable");
    JPanel panel = new JPanel(new BorderLayout());
    JTable table = new JTable(data, cols);
    TableColumnModel tcm = table.getColumnModel();
    panel.add(new JScrollPane(table), BorderLayout.CENTER);
    JTable table2 = new JTable(0, 2);
    table2.setPreferredScrollableViewportSize(new Dimension(0,0));
    TableColumnModel tcm2 = table2.getColumnModel();
    tcm2.getColumn(0).setHeaderValue("C1-2");
    tcm2.getColumn(1).setHeaderValue("C3-4");
    panel.add(new JScrollPane(table2), BorderLayout.NORTH);
    frame.setContentPane(panel);
    frame.pack();
    tcm2.getColumn(0).setWidth(tcm.getColumn(0).getWidth()+tcm.getColumn(1).getWidth());
    tcm2.getColumn(1).setWidth(tcm.getColumn(2).getWidth()+tcm.getColumn(3).getWidth());
    frame.setVisible(true);
  }
}

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


Эксперт
****


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

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



Можно объединить столбцы таблицы до максимального уровня заголовка:
Код

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

public class TableTest extends DefaultTableCellRenderer implements Icon {
  Object[][] header;
  String top;
  String left;
  String right;
  public TableTest(Object[][] header) {
    this.header = header;
    setIcon(this);
  }

  static public void main(String[] arg) {
    String[][][] data = { { {"1", "2" }, {"3", "4"} }, { {"5", "6" }, {"7", "8"} } };
    Object[][] header = { {"C1-2", new String[] {"C1", "C2"} }, {"C3-4", new String[] {"C3", "C4"} } };
    JFrame frame = new JFrame("TableTest");
    frame.setDefaultCloseOperation (WindowConstants.EXIT_ON_CLOSE);
    JTable table = new JTable(data, header);
    TableCellRenderer tcr = new TableTest(header);
    table.setDefaultRenderer (Object.class, tcr);
    table.getTableHeader ().setDefaultRenderer (tcr);
    table.getTableHeader ().setMinimumSize (new Dimension(0,table.getRowHeight () * 2));
    frame.setContentPane (new JScrollPane(table));
    frame.pack ();
    frame.setVisible (true);
  }

  public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    if (row < 0) {
      Object[] oo = (Object[])header[column];
      String[] ss = (String[])oo[1];
      top = oo[0].toString();
      left = ss[0];
      right = ss[1];
      setSize (new Dimension(0,table.getRowHeight () * 2));
    } else {
      String[] ss = (String[])value;
      top = null;
      left = ss[0];
      right = ss[1];
    }
    super.getTableCellRendererComponent(table, null, isSelected, hasFocus, row, column);
    return this;
  }

  public void paintIcon (Component c, Graphics g, int x, int y) {
    int w = getIconWidth();
    int h = getIconHeight();
    g.setColor (getBackground ());
    g.fillRect (x, y, w, h);
    g.setFont (getFont ());
    FontMetrics fm = g.getFontMetrics ();
    if (top != null) {
      g.setColor (Color.BLACK);
      g.drawRect (x, y, w - 1, h - 1);
      g.drawLine (x, y + h/2, x + w, y + h/2);
      g.drawString (top, x + w/2 - (int)fm.getStringBounds (top, g).getWidth ()/2, y + h/4 + fm.getMaxAscent () / 2);
      y += h/2;
      h /= 2;
    }
    g.setColor (Color.BLACK);
    g.drawLine (x + w/2, y, x + w/2, y + h);
    g.drawString (left,  x + w/4 - (int)fm.getStringBounds (left, g).getWidth ()/2, y + h/2 + fm.getMaxAscent () / 2);
    g.drawString (right, x + 3*w/4 - (int)fm.getStringBounds (right, g).getWidth ()/2, y + h/2 + fm.getMaxAscent () / 2);
  }

  public int getIconWidth () {
    return getWidth();
  }

  public int getIconHeight () {
    return getHeight();
  }
}

(лучше если TableRender будет возвращать JPanel на которой размещены JLabel, оформленные в соответствии L&F).
PM   Вверх
izver84
Дата 8.4.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо agR,   за ссылку на пост smile 
Заголовок

осталось подогнать под себя.


--------------------
Если новая программа с первого раза компилируется без ошибок, значит, она написана принципиально неправильно. 
PM MAIL   Вверх
Marusja
Дата 8.4.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мыслитель



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 27.4.2007
Где: Нижний Новгород

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



Если setText() оформленный так "<html>Первая строка<br>Вторая строка" дает надпись в 2 строки и на кнопке, и на метке или всплывающей подсказке, может можно сделать сетКэпшен на заголовке столбца или таблицы так же?
PM MAIL Skype   Вверх
math64
Дата 8.4.2008, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Да, использование <html>...<br>... в тексте заголовка столбца или ячейки таблицы приведёт к тому, что надпись будет выведна в две стороки. Но нужно позаботиться о высоте строки таблицы или заголовка, чтобы она влезла.
PM   Вверх
izver84
Дата 9.4.2008, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не катить html, 
Таблица должна выгледеть так как показана на прикленном файле.


Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  untitled2.JPG 85,76 Kb


--------------------
Если новая программа с первого раза компилируется без ошибок, значит, она написана принципиально неправильно. 
PM MAIL   Вверх
math64
Дата 9.4.2008, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



html работает, но чтобы разместить текст по центру нужно использовать свой CellRenderer.
Код

public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
  if (row < 0) {
    Object[] oo = (Object[])header[column];
    String[] ss = (String[])oo[1];
    top = oo[0].toString();
    left = ss[0];
    right = ss[1];
    setSize (new Dimension(0,table.getRowHeight () * 2));
    value = "<html><center>" + top + "</center><hr><table width=200 border=1><tr><th>" + left + "</th><th>" + right + "</th></tr></table>";
  } else {
    String[] ss = (String[])value;
    top = null;
    left = ss[0];
    right = ss[1];
    value = "<html><table width=200 border=1><tr><td>" + left + "</td><td>" + right + "</td></tr></table>";
  }
  super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
  setHorizontalAlignment (CENTER);
  return this;
}

PM   Вверх
izver84
Дата 9.4.2008, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



проблема не в расположении текста по центру. а в моногоуровневом заголовке (ну я и закрутил   smile ).  На нижнем уровне заголовка кол-во наименований заголовка  равно кол-ву столбцом,а верхний уровень состоит из групп столбцов нижнего. 
Короче в прошлый раз я приклепил файл, там показано как должно быть.
Если использовать html. то пример будет выглядеть так:
допустим таблица состоит из двух столбцов (имя и фамилия,нижний ряд заголовка) и над нижним уровнем расположен верхний - клиент:
   клиент
имя    фамилия
Вася  Иванов
вариант "<html>клиент<br>имя</html> ","<html>клиент<br>фамилия </html> " - работает
получается
клиент   клиент
имя        фамилия
Вася       Иванов
но мне это неподходит
скорей всего  нужно типа "<html>клиент<br>имя,фамилия </html> ", где через запятую будут перечилины заголовки столбцов на нижнем уровне.
вот моя модель
Код

import java.awt.Container;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Vector;
import javax.swing.table.AbstractTableModel;


//import org.postgresql.Driver;

/*
 * Created on 14.06.2004
 *
 * To change the template for this generated file go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */

/**
 * @author golden
 *
 * To change the template for this generated type comment go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */

public class database extends AbstractTableModel{
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public String[] columnNames;
    public String[] dbcolumnNames;
    public Vector rows = new Vector();
    public ResultSetMetaData metaData;
    public Statement statement;
    public ResultSet resultSet;
    public Connection con; 
    public String tableName;
    
    public int getColumnCount()
    {
      return columnNames.length;
    }

    public String getColumnName(int n)
    {
        
        //String[] columnNames = {"Фамилия", "Имя", "Отчество", "Дата"};
      return columnNames[n];
    }
    public String getDBColumnName(int n)
    {
        
        //String[] columnNames = {"Фамилия", "Имя", "Отчество", "Дата"};
      return dbcolumnNames[n];
    }
    public int getDBColumnCount()
    {
      return dbcolumnNames.length;
    }
    
    public int getRowCount()
    {
        return rows.size();
    }
    public int addRow()
    {

        int r=rows.size()+1;
        return r;
    }

    public Object getValueAt(int aRow, int aColumn)
    {
        Vector row = (Vector)rows.elementAt(aRow);
        
        return row.elementAt(aColumn);
    }
//-----------------------------------------------------------------------------------------------
    public database(String query, String DBNAME, String USERNAME, String PASSWORD, String tableName, String tableName1, String tableName2,String[] columnNames)
    {
       
        this.columnNames = columnNames; 
        this.tableName = tableName;
        fireTableDataChanged();

        Driver d;
        try{
            d = (Driver)Class.forName("org.postgresql.Driver").newInstance();
        }
        catch (Exception e) {
            System.out.println("Error 1");
            System.out.println(e.getStackTrace());
        }
        try{
            con = DriverManager.getConnection
        //("jdbc:postgresql://localhost:5432/"+DBNAME,USERNAME,PASSWORD);
            ("jdbc:postgresql://192.168.4.164:5432/"+DBNAME,USERNAME,PASSWORD);
    //    statement =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

        statement = con.createStatement();
        SqlReload(query);
        }
        catch(SQLException e)
        {
            System.out.println(e.getMessage());
        }
    }
    
//---------------------------------------------------------------------------------------------
    public boolean isCellEditable(int row, int column)
    {
        try
        {
          return metaData.isWritable(column+1);
        }
        catch (SQLException e)
        {
          return false;
        }
          // return true;
    }
//--------------------------------------------------------------------------------------------

    public void setValueAt(Object value, int row, int column)
    {
      try
        {
          String columnName = dbcolumnNames[column];

                     //     System.out.println(columnName);
                     //     System.out.println(dbRepresentation(column, value));
         String query =
            "UPDATE "+tableName+
            " SET "+columnName+" = "+
             dbRepresentation(column, value)+
            " WHERE ";
        
        for(int col = 0; col < getColumnCount();col++)
        {
        //  String colName = getColumnName(col);
          
          String colName = getDBColumnName(col);

          if (colName==columnName)
           {
            continue;
           }
                          if (col != 0)
                           {
                             query = query + " and ";
                            }
                             query = query + colName +" = "+
                             dbRepresentation(col, getValueAt(row, col));
           }
//        System.out.println(query);
        PreparedStatement pstmt =
        con.prepareStatement(query);
        pstmt.executeUpdate();
        //System.out.println(pstmt.executeUpdate());
        Object val;
        val = tbRepresentation(column,value);
        Vector dataRow = (Vector)rows.elementAt(row);
        dataRow.setElementAt(val, column);
        fireTableDataChanged();
        
        fireTableCellUpdated(row,column);
        }
        catch (Exception ex)
        {
           System.err.println(ex);
        }
    }
    

//-------------------------------------------------------------------------------------------    
    public Object dbRepresentation(int column, Object value) throws NumberFormatException
    {
    
        Object val;
        int type;
        if (value == null)
        {
            return "null";
        }
        try
        {  //   System.out.println("column+1");    System.out.println("type");
            
           type = metaData.getColumnType(column+1);
        //   System.out.println("type");
        //   System.out.println(type);
        }
        catch (SQLException e)
        {
          return value.toString();
        }
        
        
        switch(type)
        {
            case Types.BIGINT:
                return val = new Long(value.toString().trim());
            case Types.CHAR:
                // System.out.println("CHAR");
                 return val = "'"+new String(value.toString().trim())+"'";
            case Types.TINYINT:
            case Types.SMALLINT:
            case Types.INTEGER:
//                 System.out.println("INTEGER");
                return val = new Integer(value.toString().trim());
            
            case Types.REAL:
            case Types.FLOAT:
            case Types.DOUBLE:
            case Types.NUMERIC:
//                 System.out.println("NUMERIC");
                return val = new Double(value.toString().trim());
            
            default: return val = "'"+new String(value.toString().trim())+"'";
        }
     }
    //---------------------------------------------------------------------------------------
    public Object tbRepresentation(int column, Object value)   throws NumberFormatException
    {
        
        Object val;
        int type;
        if (value == null)
         {   return "null";   }
      try
       { type = metaData.getColumnType(column+1); }
      catch (SQLException e) {   return value.toString().trim(); }

      switch(type)
       {
         case Types.BIGINT:
               return val = new Long(value.toString().trim());
         case Types.TINYINT:
         case Types.SMALLINT:
         case Types.INTEGER:
              return val = new Integer(value.toString().trim());
         case Types.REAL:
         case Types.FLOAT:
         case Types.DOUBLE:
         case Types.NUMERIC:     
               return val = new Double(value.toString().trim());
         default: return val = new String(value.toString());
               
        }
    }
    //---------------------------------------------------------------------------------------

    
    public void SqlReload(String query)
    {
     try{
         fireTableDataChanged();
                resultSet = statement.executeQuery(query);
                metaData = resultSet.getMetaData();
                int numberOfColumns =  metaData.getColumnCount();
                dbcolumnNames = new String[numberOfColumns];
                for(int column = 1; column <= numberOfColumns; column++)
                {
                    dbcolumnNames[column-1] =
                    metaData.getColumnName(column);
                }
                rows = new Vector();
                while (resultSet.next())
                {
                   Vector newRow = new Vector();
                    for (int i = 1; i <=  getColumnCount(); i++)
                    {
                      newRow.addElement(resultSet.getObject(i));
                    }
                    
                    rows.addElement(newRow);
                }
     }
     catch(SQLException e)
        {
            System.out.println(e.getMessage());
        }
    }
//----------------------------------------------------------------------------------------
    public void SqlInsert(String query,String query1)
    {
            try{
                PreparedStatement pstmt =
                    con.prepareStatement(query);
                    pstmt.executeUpdate();
                   SqlReload(query1);
                }
        catch(SQLException e)
        {
            System.out.println(e.getMessage());
        }
    }
//******************************************************************************************    
    
    public void Sql(String query1)
    {
            try{
                PreparedStatement pstmt =
                    con.prepareStatement(query1);
                    pstmt.executeUpdate();
//                 SqlReload(query1);
                }
        catch(SQLException e)
        {
            System.out.println(e.getMessage());
        }
    }
  //---------------------------------------------------------------------------------------
    public void SqlDelete(String query,String query1,int cur_row)
    {
            try{   
                String query_=query;
                query_= query_ + tbRepresentation(0, getValueAt(cur_row, 0));
                fireTableDataChanged();
                PreparedStatement pstmt = con.prepareStatement(query_);
            
                  System.out.println(query_);
                
                pstmt.executeUpdate();
             //   System.out.println(pstmt.execute());
            //    PreparedStatement pstmt =
            //    con.prepareStatement(query_);
            //    pstmt.setDouble(1,cur_row);
            //    query_= query_ + dbRepresentation(0, getValueAt(cur_row, 0));
//                System.out.println(pstmt.executeUpdate()); 
             //   System.out.println(query_);
                
              SqlReload(query1);
            }
        catch(SQLException e)
        {
            System.out.println(e.getMessage());
        }
    }
  //---------------------------------------------------------------------------------------    
    
     public void fireTableRowsDeleted(int firstRow, int lastRow) {
//         System.out.println("fireTableRowsDeleted");
          //  rows.remove(firstRow);
          }
     public void fireTableRowsInserted(int firstRow, int lastRow) {
        // Vector newRow = new Vector();
        //    for (int i = 1; i <=  getColumnCount(); i++)
        //    {
        //      newRow.addElement(resultSet.getObject(i));
        //    }
                //    rows.addElement(newRow);
//         System.out.println("fireTableRowsInserted");
          }    
    
    
//------------------------------------------------------
}


и собственно класс с таблицей
Код


import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.JPanel;
import javax.swing.JFrame;

import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class shara extends JFrame {

    private static final long serialVersionUID = 1L;

    private JPanel jContentPane = null;

    private JScrollPane jScrollPane = null;

    private JTable jTable = null;
    
    private database DB = null;
    /**
     * This method initializes jScrollPane    
     *    
     * @return javax.swing.JScrollPane    
     */
    private JScrollPane getJScrollPane() {
        if (jScrollPane == null) {
            jScrollPane = new JScrollPane();
            jScrollPane.setViewportView(getJTable());
        }
        return jScrollPane;
    }

    /**
     * This method initializes jTable    
     *    
     * @return javax.swing.JTable    
     */
    private JTable getJTable() {
        if (jTable == null) {
            jTable = new JTable();
            jTable.setRowSelectionAllowed(true);
            jTable.setCellSelectionEnabled(true);
            jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            jTable.setShowGrid(true);
            jTable.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
            jTable.setPreferredSize(new Dimension(500,150000));
            jTable.setModel(getDB());
            jTable.getColumnModel().getColumn(0).setPreferredWidth(1);
            jTable.getColumnModel().getColumn(1).setPreferredWidth(4);
            jTable.getColumnModel().getColumn(2).setPreferredWidth(64);
            jTable.getColumnModel().getColumn(3).setPreferredWidth(64);
            jTable.getColumnModel().getColumn(4).setPreferredWidth(64);
            jTable.getColumnModel().getColumn(5).setPreferredWidth(64);
            jTable.getColumnModel().getColumn(6).setPreferredWidth(64);
        
        }
        return jTable;
    }
    private database getDB() {
        if (DB == null) {
            DB = new database(
                    "SELECT id,kpot,dn,nekp,nm,nekpf,nmf FROM s_marhrut ORDER BY kpot,dn",
        //            "cbit", "postgres", "syrus", "s_marhrut", "", "",new  String{"Ид", "Код","День недели","Номер экипажа ц/м","Номер маршрута ц/м","Номер экипажа мор","Номер маршрута мор"});
                    "cbit", "postgres", "syrus", "s_marhrut", "", "",new  String[]{"<html>id<br>Ид,hj</html>", "Код","День недели","Номер экипажа ц/м","Номер маршрута ц/м","Номер экипажа мор","Номер маршрута мор"});
        }
        return DB;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Автоматически созданная заглушка метода
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                shara thisClass = new shara();
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                thisClass.setVisible(true);
            }
        });
    }

    /**
     * This is the default constructor
     */
    public shara() {
        super();
        initialize();
    }

    /**
     * This method initializes this
     * 
     * @return void
     */
    private void initialize() {
        this.setSize(700, 264);
        this.setContentPane(getJContentPane());
        this.setTitle("JFrame");
    }

    /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            GridLayout gridLayout = new GridLayout();
            gridLayout.setRows(1);
            jContentPane = new JPanel();
            jContentPane.setLayout(gridLayout);
            jContentPane.add(getJScrollPane(), null);
        }
        return jContentPane;
    }

}  //  @jve:decl-index=0:visual-constraint="10,10"



Это сообщение отредактировал(а) izver84 - 9.4.2008, 14:47


--------------------
Если новая программа с первого раза компилируется без ошибок, значит, она написана принципиально неправильно. 
PM MAIL   Вверх
math64
Дата 9.4.2008, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Есть три варианта решения:
1. доводить до ума вариант который работает под JDK 1.3 - но это довольно сложно 
http://www.crionics.com/products/opensourc...eExamples1.html
2. Создать свой собственный заголовок на основе GridBagLayoutManager на панели - когда-то давно на этом форуме был пример но найти его я не смог.
3. доводить до ума один из моих вариантов (но вариант с объединением колонок тебе наверно не подойдёт - тебе нужно не только отображение но и редактирование).
Если не объединять колонки, то CellRenderer заголовка должен возвращать панель, на которой расположены две JLabel, причём нижняя JLabel занимает нижнюю половину заголовка, а верхняя занимает верхнюю половину и ещё выдвинута влево или вправо соответственно. Никакой LayoutManager так тебе их не разместит, ты должен установить его d null и разместить метки вручную.
Выдвинутая часть метки отрисовываться не будет, но будет отрисовываться при отображении соседней колонки. Но линии сетки будут прорезать заголовок, поэтому нужно отключить вертикальные линии сетки. Разумеется, нужно запретить переставлять колонки, но можно разрешить изменять их размеры.

Добавлено через 9 минут и 18 секунд
Вот что-то в этом роде:
Код

public class MyRenderer extends DefaultTableCellRenderer {
  private JPanel panel;
  private JPanel panel2;
  private JLabel[] labels;

  public MyRenderer() {
    setOpaque(true);
  }

  public Component getTableCellRendererComponent(JTable table, Object value,
                                                 boolean isSelected,
                                                 boolean hasFocus, int row,
                                                 int column) {
    setBackground(Color.white);
    setForeground(Color.black);
    setIcon(null);
    super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
                                        row, column);
    if (value instanceof Icon) {
      setHorizontalAlignment(CENTER);
      setText(null);
      setIcon((Icon)value);
      return this;
    } else {
      if (row < 0) {
        String s = value.toString();
        char c = '|';
        int index = s.indexOf(c);
        JTableHeader header = table.getTableHeader();
        if (index < 0)
          index = s.indexOf(c = '/');
        if (index >= 0) {
          if (panel2 == null)
            panel2 = new JPanel(null);
          panel2.removeAll();
          if (labels == null || labels.length < 2)
            labels = new JLabel[2];
          JLabel label0 = labels[0];
          if (label0 == null)
            labels[0] = label0 = new JLabel();
          panel2.add(label0);
          JLabel label1 = labels[1];
          if (label1 == null)
            labels[1] = label1 = new JLabel();
          panel2.add(label1);
          String upperValue = s.substring(0, index);
          String lowerValue = s.substring(index + 1);
          TableColumnModel model = header.getColumnModel();
          TableColumn thisColumn = model.getColumn(column);
          int width = thisColumn.getWidth();
          int height = header.getHeight()/2;
          int x = 0, w = width;
          if (header.getDraggedColumn() != thisColumn && c == '|') {
            final boolean ltr = header.getComponentOrientation().isLeftToRight();
            for (int i = column - 1; i >= 0; i--) {
              TableColumn aColumn = model.getColumn(i);
              if (isSameUpperValue(aColumn, upperValue, c)) {
                int ww = aColumn.getWidth();
                if (ltr) x -= ww;
                w += ww;
              } else
                break;
            }
            for (int i = column + 1, n = model.getColumnCount(); i < n; i++) {
              TableColumn aColumn = model.getColumn(i);
              if (isSameUpperValue(aColumn, upperValue, c)) {
                int ww = aColumn.getWidth();
                if (!ltr) x -= ww;
                w += ww;
              } else
                break;
            }
          }
          setupLabel(label0, upperValue, header);
          setupLabel(label1, lowerValue, header);
          label0.setBounds(x, 0, w, height);
          label1.setBounds(0, height, width, height);
          panel2.setBounds(0, 0, width, 2 * height);
          panel2.setBorder(null);
          if (c != '|') {
            label0.setBorder(null);
            label1.setBorder(null);
            panel2.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
          }
          return panel2;
        }
        setupLabel(this, s, header);
      } else {
        setHorizontalAlignment(JLabel.LEFT);
        setFont(table.getFont());
      }
    }
    return this;
  }

  private boolean isSameUpperValue(TableColumn column, String upperValue, char c) {
    String s = column.getHeaderValue().toString();
    int len = upperValue.length();
    return s.length() > len && s.charAt(len) == c && s.startsWith(upperValue);
  }

  private void setupLabel(JLabel label, String value, JTableHeader tableHeader) {
    label.setText(value);
    label.setHorizontalAlignment(JLabel.CENTER);
    label.setFont(tableHeader.getFont());
    label.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
    label.setBackground(tableHeader.getBackground());
    label.setForeground(tableHeader.getForeground());
  }
}


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

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

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


 




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


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

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