2012-10-29 53 views
2

我已经完成了Google搜索,并试图实现一些关于JTable和JScrollPane的不同解决方案。以下是我遇到的问题的一个独立示例。我希望能够有这些表的水平滚动条。您的援助将深表赞赏:试图获得一个JTable + JScrollPane滚动

package org.examples; 

import java.awt.EventQueue; 
import java.awt.Frame; 
import java.awt.Rectangle; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JViewport; 
import javax.swing.ListSelectionModel; 
import javax.swing.table.AbstractTableModel; 

public class TableTest extends JFrame { 

    private JTable tableTest_1; 
    private ArrayListStringTableModel tableTestModel_1; 

    private JTable tableTest_2; 
    private ArrayListStringTableModel tableTestModel_2; 

    private JScrollPane tableTestScrollPane_1; 
    private JScrollPane tableTestScrollPane_2; 

    private class ArrayListStringTableModel extends AbstractTableModel { 

     /** 
     * 
     */ 
     private static final long serialVersionUID = 3071398398073956893L; 

     private List <String> listOfStrings; 

     private String[] columnNames = {""}; 

     public ArrayListStringTableModel (String[] lColumnNames) { 
      columnNames = lColumnNames; 
      listOfStrings = new ArrayList<String>(); 
     } 

     public void addString (String lString) { 
      String localString = lString; 
      listOfStrings.add(localString); 
     } 

     public int getColumnCount() { 
      return columnNames.length; 
     } 

     public int getRowCount() { 
      return listOfStrings.size(); 
     } 

     public String getColumnName (int col) { 
      return columnNames[col]; 
     } 

     public Object getValueAt (int row, int column) { 
      Object returnObject = null; 
      String localString = listOfStrings.get(row); 
      switch (column) { 
      case 0 : 
       returnObject = (Object)localString; 
       break; 
      } 
      return returnObject; 
     } 

    } 


    /** 
    * Initialize the contents of the frame. 
    */ 
    public TableTest() { 

     String[] rows = {"Damage Resistance (only vs. Head Shots) Physical Damage Reduction, Resistant, 75% ; Only Works Against Head Shots Rare attack , Only Amyklai can use Energy Damage Reduction, Resistant, 75% ; Only Works Against Head Shots Rare attack , Only Amyklai can use", 
       "Mental Defense (10 points total),Only Amyklai can use", 
       "Sight Group Flash Defense (5 points),Only Amyklai can use", 
       "Resistant Protection (10 PD/10 ED),STR Min 18 , Costs Half Endurance", 
       "Banded Mail Resistant Protection (8 PD/8 ED)" 
     }; 

     String[] columns = {"Damage"}; 

     tableTestModel_1 = new ArrayListStringTableModel(columns); 
     tableTestModel_2 = new ArrayListStringTableModel(columns); 

     // Set up the main window frame 
     setTitle("Table Test"); 
     setSize(435, 375); 
     getContentPane().setLayout(null); 


     for (int i=0; i <= 4; i++) { 
      tableTestModel_1.addString(rows[i]); 
      tableTestModel_2.addString(rows[i]); 
     } 
     tableTest_1 = new JTable(tableTestModel_1); 
     tableTest_1.setBounds(new Rectangle(10, 10, 395, 250)); 
     tableTest_1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
     tableTestScrollPane_1 = new JScrollPane(tableTest_1); 
     tableTestScrollPane_1.setBounds(10, 10, 405, 80); 
     tableTestScrollPane_1.setColumnHeaderView(tableTest_1); 

     tableTest_2 = new JTable(tableTestModel_2); 
     tableTest_2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     tableTest_2.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
     tableTestScrollPane_2 = new JScrollPane(tableTest_2); 
     tableTestScrollPane_2.setBounds(10, 100, 200, 80); 

     JViewport viewport = new JViewport(); 
     viewport.setView(tableTest_2); 
     viewport.setPreferredSize(tableTest_2.getPreferredSize()); 
     tableTestScrollPane_2.setRowHeaderView(viewport); 
     tableTestScrollPane_2.setCorner(JScrollPane.UPPER_LEFT_CORNER, tableTest_2.getTableHeader()); 

     getContentPane().add(tableTestScrollPane_1); 
     getContentPane().add(tableTestScrollPane_2); 

    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        TableTest testtableWindow = new TableTest(); 
        testtableWindow.setVisible(true);             
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

    } 

} 
+6

这是你的第一个问题'的getContentPane()的setLayout(NULL);'这将导致你需要的问题...... – MadProgrammer

回答

6

这是移动台到滚动窗格列标题位置,不具有滚动条...摆脱它......

tableTestScrollPane_1.setColumnHeaderView(tableTest_1); 

这实际上是从滚动窗格中移除tableTest_2,并将其放置在一个新的视图端口,并将其添加到行标题...没有滚动条。

viewport.setView(tableTest_2); 
... 
tableTestScrollPane_2.setRowHeaderView(viewport); 

一个组件只能属于一个父...

尝试类似的东西代替;

tableTest_1 = new JTable(tableTestModel_1); 
tableTest_1.setBounds(new Rectangle(10, 10, 395, 100)); 
tableTest_1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
tableTestScrollPane_1 = new JScrollPane(tableTest_1); 

tableTest_2 = new JTable(tableTestModel_2); 
tableTest_2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
tableTest_2.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
tableTestScrollPane_2 = new JScrollPane(tableTest_2); 

getContentPane().add(tableTestScrollPane_1); 
getContentPane().add(tableTestScrollPane_2); 
+0

@kleopatrs我被代码的光彩眼花缭乱:P。 – MadProgrammer