2016-05-20 7 views
-1

私はJTableを動的に取り込みます。テーブルのサイズを常に行数に合わせて変更します。テーブルがパネルにあり、パネルの内容を印刷する必要があるため、スクロールする必要はありません。 私はこれ試してみた:JTableを行数に合わせてサイズを変更する

Dimension d = itemsTable.getPreferredSize(); 
    //scrollPane.setPreferredSize(new Dimension(d.width,itemsTable.getRowHeight()*itemsTable.getRowCount()+10)); 
    itemsTable.setPreferredScrollableViewportSize(new Dimension(d.width,itemsTable.getRowHeight()*itemsTable.getRowCount()+1)) 

をしかし、動作するようには思えません。

public void getDetails(PosView pv){ 
    Connection con = con(); 
    DefaultTableModel model = (DefaultTableModel)pv.getItemsTable().getModel(); 
    String date = null; 
    double total = 0.0, paid = 0.0; 
    try{ 
     ps = con.prepareStatement("SELECT DISTINCT AMOUNT_PAYABLE, AMOUNT_PAID, BALANCE, DATE FROM SALES WHERE PAYMENT_ID = ?"); 
     ps.setString(1, paymentId); 
     rs = ps.executeQuery(); 
     while(rs.next()){ 
      total = (rs.getDouble(1)); 
      paid += (rs.getDouble(2)); 
      date = rs.getString(4); 
     } 
     double balance = total - paid; 
     pv.setDate(date); 
     pv.setPaymentId(paymentId); 

     ps = con.prepareStatement("SELECT QUANTITY, ITEM_NAME, SELLING_PRICE, TOTAL FROM ITEMS_BOUGHT WHERE ID = ?"); 
     ps.setString(1, paymentId); 
     rs = ps.executeQuery(); 
     while(rs.next()){ 
      Object data[] = {rs.getInt(1), rs.getString(2), rs.getDouble(3),rs.getDouble(4)}; 
      model.addRow(data); 
     } 

     logActivity(userId, "PAYMENT RECEIPT "+ paymentId +" GENERATED", con); 
     pv.setTotal(total); 
     pv.setPaid(paid); 
     pv.setBalance(balance); 
    }catch(SQLException e){ 
     showMessageDialog(null, e.getMessage()); 
    }finally{ 
     try { 
      if(ps!=null) 
       ps.close(); 
      con.close(); 
     }catch(Exception e){} 
    } 
} 
+0

1)より早くより良いヘルプについては、[MCVE]またはPOST [含まれるショート、自己を、修正例](http://www.sscce.org/)。 2)*「しかしそれはうまくいかない」*正確にはどうなるの? –

+0

テーブルのサイズは変更されません。何も起こらないように – Charles

+0

OK .. MCVEはどこですか? –

答えて

0

私はこれが最善の方法だとは思わない。しかし、あなたが主張するように、私は以下のコードを入れました。

import javax.swing.RowFilter; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableRowSorter; 

/** 
* 
* @author user 
*/ 
public class MyFrame extends javax.swing.JFrame { 

    private DefaultTableModel model = null; 

    TableRowSorter<DefaultTableModel> sorter = null; 

    /** 
    * Creates new form MyFrame 
    */ 
    public MyFrame() { 
     initComponents(); 
     model = new DefaultTableModel(null, new String[]{ 
      "Name", "age", "salary" 
     }); 
     jTable1.setModel(model); 
     for (int i = 0; i < 10; i++) { 
      model.addRow(new Object[]{"Beniton", 34, 10000}); 
      model.addRow(new Object[]{"Joema", 33, 10000}); 
     } 
     sorter = new TableRowSorter<DefaultTableModel>(model); 
     jTable1.setRowSorter(sorter); 
     int rowCount = model.getRowCount(); 
     this.setSize(this.getWidth(), 50+ (jTable1.getRowHeight()*(rowCount+1))); 
    } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 
     java.awt.GridBagConstraints gridBagConstraints; 

     jLabel1 = new javax.swing.JLabel(); 
     searchBox = new javax.swing.JTextField(); 
     jTable1 = new javax.swing.JTable(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     getContentPane().setLayout(new java.awt.GridBagLayout()); 

     jLabel1.setText("Search"); 
     getContentPane().add(jLabel1, new java.awt.GridBagConstraints()); 

     searchBox.setMaximumSize(new java.awt.Dimension(150, 20)); 
     searchBox.setMinimumSize(new java.awt.Dimension(150, 20)); 
     searchBox.setName("searchField"); // NOI18N 
     searchBox.setPreferredSize(new java.awt.Dimension(150, 20)); 
     searchBox.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       searchBoxActionPerformed(evt); 
      } 
     }); 
     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridx = 1; 
     gridBagConstraints.gridy = 0; 
     gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 
     gridBagConstraints.weightx = 1.0; 
     gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); 
     getContentPane().add(searchBox, gridBagConstraints); 
     searchBox.getAccessibleContext().setAccessibleName(""); 

     jTable1.setModel(new javax.swing.table.DefaultTableModel(
      new Object [][] { 
       {null, null, null, null}, 
       {null, null, null, null}, 
       {null, null, null, null}, 
       {null, null, null, null} 
      }, 
      new String [] { 
       "Title 1", "Title 2", "Title 3", "Title 4" 
      } 
     )); 
     gridBagConstraints = new java.awt.GridBagConstraints(); 
     gridBagConstraints.gridx = 0; 
     gridBagConstraints.gridy = 1; 
     gridBagConstraints.gridwidth = 2; 
     gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 
     gridBagConstraints.weightx = 1.0; 
     gridBagConstraints.weighty = 1.0; 
     getContentPane().add(jTable1, gridBagConstraints); 

     pack(); 
    }// </editor-fold>       

    private void searchBoxActionPerformed(java.awt.event.ActionEvent evt) {           
     if (searchBox.getText().length() > 0) { 
      Integer value = Integer.parseInt(searchBox.getText()); 
      // Checking the age as Index is 1 
      RowFilter<DefaultTableModel, Integer> rf = RowFilter.numberFilter(RowFilter.ComparisonType.BEFORE, value, 1); 
      sorter.setRowFilter(rf); 
     } else { 
      sorter.setRowFilter(null); 
     } 
    }           

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new MyFrame().setVisible(true); 
      } 
     }); 
    } 

    // Variables declaration - do not modify      
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JTable jTable1; 
    private javax.swing.JTextField searchBox; 
    // End of variables declaration     
} 
+0

私はあなたのコード行 'this.setSize(this.getWidth()、50+(jTable1.getRowHeight()*(rowCount + 1))))を使用しました。これより早い。私が望むものに合うように修正しました。ありがとう – Charles

1

getPreferredScrollableViewportSize()をオーバーライドして行の高さと行数の積を返します。行が追加されるたびに、pack()囲むウィンドウ。

image

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.AbstractTableModel; 

/** 
* @see http://stackoverflow.com/a/37343900/230513 
* @see http://stackoverflow.com/a/37318673/230513 
*/ 
public class Test { 

    private void display() { 
     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     class MyTableModel extends AbstractTableModel { 

      private int n = 8; 

      private void addRow() { 
       n++; 
       fireTableRowsInserted(n - 1, n - 1); 
      } 

      @Override 
      public int getRowCount() { 
       return n; 
      } 

      @Override 
      public int getColumnCount() { 
       return 4; 
      } 

      @Override 
      public Object getValueAt(int rowIndex, int colIndex) { 
       return "R" + rowIndex + ":C" + colIndex; 
      } 
     }; 
     MyTableModel model = new MyTableModel(); 
     JTable table = new JTable(model) { 
      @Override 
      public Dimension getPreferredScrollableViewportSize() { 
       return new Dimension(super.getPreferredSize().width, 
        getRowHeight() * getRowCount()); 
      } 
     }; 
     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
     f.add(new JScrollPane(table)); 
     f.add(new JButton(new AbstractAction("Add Row") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       model.addRow(); 
       f.pack(); 
      } 
     }), BorderLayout.SOUTH); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Test()::display); 
    } 
} 
+0

または "あいまいな"要件に基づいて、JasperRepertsを使用して、印刷されたレポート – MadProgrammer

+0

を生成します。@ MadProgrammerのポイントは十分です。示されているアプローチはその質問に答えますが、印刷のためのスケーリングが不十分です。 – trashgod

関連する問題