2014-06-27 38 views
0

首先,票數是代碼:的JTable中JScrollPane的內部的JPanel使用GridBagLayout的,不看,因爲它應該

import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 

import javax.swing.JComponent; 

import javax.swing.JButton; 
import javax.swing.JToolBar; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.TableColumn; 

@SuppressWarnings("serial") 
public class Spielklasse extends JPanel{ 

private int iEntries = 1; 

public Spielklasse(String strTitle){ 
    setLayout(new GridBagLayout()); 

    //dummy to fill vertical space 
    GridBagConstraints c = new GridBagConstraints(); 
    c.gridx = 0; 
    c.gridy = 1000; 
    c.fill = GridBagConstraints.BOTH; 
    c.weightx=1; 
    c.weighty=1; 
    c.gridwidth = 2; 
    add(new JLabel(" "),c); 
} 

public void addEntry(JComponent component){ 

    GridBagConstraints c = new GridBagConstraints(); 
    c.anchor = GridBagConstraints.NORTHWEST; 
    c.gridx = 1; 
    c.gridy = iEntries; 
    c.weightx = 1; 
    c.insets = new Insets(10, 20, 10, 20); 
    c.fill = GridBagConstraints.HORIZONTAL; 
    add(component, c); 

    iEntries++; 

} 

public static JPanel addExampleTablePanel() { 
    String[] columnNames = { "first", "second", "third", "fourth", "fifth", "sixth" }; 

    String[][] strArr = new String[100][columnNames.length]; 

    for (int i = 0; i < strArr.length; i++) { 
     for (int j = 0; j < strArr[0].length; j++) { 
      strArr[i][j] = i + " xxxxx " + j; 
     } 
    } 

    JTable table = new JTable(strArr, columnNames) { 
     @Override 
     public Dimension getPreferredScrollableViewportSize() { 
      int headerHeight = getTableHeader().getPreferredSize().height; 
      int height = headerHeight + (10 * getRowHeight()); 
      int width = getPreferredSize().width; 
      return new Dimension(width, height); 
     } 
    }; 

    JScrollPane scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

    TableColumn column = null; 
    for (int i = 0; i < columnNames.length; i++) { 
     column = table.getColumnModel().getColumn(i); 
     column.setPreferredWidth(50); 
     column.setMaxWidth(50); 
     column.setMinWidth(50); 
    } 

    JToolBar toolBar = new JToolBar(); 
    JButton btn = new JButton("test123"); 
    toolBar.add(btn); 

    JPanel panel = new JPanel(new GridBagLayout()); 

    GridBagConstraints c = new GridBagConstraints(); 

    c.fill = GridBagConstraints.HORIZONTAL; 
    c.gridy = 0; 
    c.weightx = 1; 
    c.weighty = 1; 
    c.gridwidth = 1; 
    c.anchor = GridBagConstraints.LINE_START; 

    panel.add(toolBar, c); 
    c.gridy = 1; 
    panel.add(scrollPane, c); 

    return panel; 
} 


public static void main(String[] args) { 

    Spielklasse mainPanel = new Spielklasse("test"); 
    mainPanel.addEntry(addExampleTablePanel()); 
    mainPanel.addEntry(addExampleTablePanel()); 
    mainPanel.addEntry(addExampleTablePanel()); 

    JFrame frame = new JFrame(); 
    frame.setSize(300, 400); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(new JScrollPane(mainPanel)); 
    frame.setVisible(true); 
} 

} 

類「Spieklasse」應該創建一個JPanel不同類型,如表的多個條目,文本框等

在這個例子中,只需要添加3個含JTable的面板。

此JTable位於JSrollPane中,應具有固定的列寬。 此JScrollPane位於JPanel內部,其中包含表格上方的工具欄以執行某些操作等。 此JPanel已添加到「Spielklasse」類型的主面板中。 主面板位於另一個JScrolLPane中。

這裏是問題: - 桌面應該有一個固定的高度,我可以設置像我想要的。在代碼示例中,大小已經固定,但我不知道爲什麼和它的大小錯誤:-) - 在表格中應該出現水平滾動條,當框架的大小小於表格的大小時(所有專欄一起)。當幀較大,萬萬應該被拉伸水平(作品已經)

我希望我的解釋是不夠好,有人能幫助我:-)

編輯:以改善camickr的更新,垂直尺寸的問題解決了。

回答

1

規模已經是固定的,但我不知道爲什麼和它的尺寸不合適太:-)

滾動窗格的大小從JTable中的getPreferredScrollableViewportSize()方法測定。

在創建表被硬編碼在JTable如下:

setPreferredScrollableViewportSize(new Dimension(450, 400)); 

所以,如果你想控制滾動窗格的默認寬度/高度,你需要重寫getPreferredScrollableViewportSize()方法返回一個合理的值。高度應包括列標題以及要顯示的表格中的行數。

也許是這樣的:

@Override 
public Dimension getPreferredScrollableViewportSize() 
{ 
    int headerHeight = table.getTableHeader().getPreferredSize().height; 
    int height = headerHeight + (10 * getRowHeight()); 
    int width = getPreferredSize().width; 
    return new Dimension(width, height); 
} 

編輯:

要使用ScrollablePanel您可以更改您的代碼:

//public class Table8 extends JPanel{ 
public class Table8 extends ScrollablePanel{ 

private int iEntries = 1; 

public Table8(String strTitle){ 
    setLayout(new GridBagLayout()); 
    setScrollableWidth(ScrollablePanel.ScrollableSizeHint.FIT); 

另一個問題是GridBagLayout的。如果沒有足夠的空間來顯示其首選大小的組件,則該組件捕捉的是最小大小。這會導致滾動窗格的問題,所以你還需要添加:

scrollPane.setMinimumSize(scrollPane.getPreferredSize()); 

或者,它可能更容易使用到另一個佈局管理器。也許是一個垂直的BoxLayout。

+0

嗨,非常感謝,這解決了垂直尺寸問題。但橫向尺寸仍不正確。當表格的大小大於框架的大小時,我想要一個水平滾動條出現在表格的下面。但是桌子的水平尺寸保持在全寬。 – ohoeppner

+0

@ user3418986,現在你有一個面板添加到框架的單個滾動條。如果你建議你在每張桌子上都有單獨的滾動條,但不要在面板上,那麼我相信你可以使用[可滾動面板](http://tips4java.wordpress.com/2009/12/20/scrollable-panel) /)。您可以將面板配置爲「適合」在滾動窗格的視口中。因此內部面板的尺寸會更小,所以您應該在每張桌子上放置滾動條。請參閱編輯。 – camickr

+0

好了,現在它的作品:)非常感謝,解決了這花了我很多時間。 – ohoeppner