2016-07-13 73 views
2

我有一個JTabbedPane,其標籤中包含三個表格。 JTabbedPane,同樣在JScrollPane。我想爲每個表顯示一個修訂表頭,它遵循架構{"Client", "Action", "Location", "Value"}。當我試圖在ActionListener中設置標題時(請參閱後面的內容),我可以自由地使用其他方法(例如,最初設置標題)。無法顯示選項卡式JTable的表格標題

其他SO帖子正在解決同樣的問題,但我無法獲得表頭顯示。唯一可行的是將數據添加到提到的ActionListener中的表格中。我不明白爲什麼沒有顯示標題,因爲我將String-matrix的數據連同表示標題的String-數組一起傳遞。

起初,這裏是關於我的表的代碼片斷,它在GUI啓動時執行(我的initialize() -method)。

tabbedPane = new JTabbedPane(JTabbedPane.TOP); 
    tabbedPane.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null)); 
    tabbedPane.setFont(new Font("Carlito", Font.PLAIN, 13)); 
    tabbedPane.setBackground(Color.WHITE); 
    tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); 

    tableBefore = new JTable(); 
    tabbedPane.addTab(descrTableBefore, null, tableBefore, null); 
    tableBefore.setFont(new Font("Carlito", Font.PLAIN, 13)); 
    tableBefore.setFocusable(false); 

    tableMainTest = new JTable(); 
    tabbedPane.addTab(descrTableMain, null, tableMainTest, null); 
    tabbedPane.setEnabledAt(1, true); 
    tableMainTest.setFont(new Font("Carlito", Font.PLAIN, 13)); 
    tableMainTest.setFocusable(false); 

    tableAfter = new JTable(); 
    tabbedPane.addTab(descrTableAfter, null, tableAfter, null); 
    tableAfter.setFont(new Font("Carlito", Font.PLAIN, 13)); 
    tableAfter.setFocusable(false); 

    scrollTables = new JScrollPane(); 
    scrollTables.setBounds(442, 11, 397, 490); 
    scrollTables.setViewportView(tabbedPane); 
    frmTestframework.getContentPane().add(scrollTables); 

下面又是一個代碼段,但此時從提到ActionListener,這是添加到一個按鈕,其將所述元件與JTable。目前我正試圖讓它與一張表一起工作:tableMainTest。所以,這就是我試圖定義表頭:

dataMatrixMain = new String[itemListMain.size()][]; 

    for(int j = 0; j < itemListMain.size(); j++) 
     dataMatrixMain[j] = itemListMain.get(j); 

    modelMain = new DefaultTableModel(dataMatrixMain, header); 

    mainGUI.tableMainTest.setModel(modelMain); 
  • headerString - 陣列與形式{"Client", "Action", "Location", "Value"}
  • itemListMain是字符串數組
  • dataMatrixMain的名單是String - 矩陣這將用於填充我的表與數據

有沒有人知道,什麼是必須陳ged使標題可見?

編輯:

當程序被啓動,用戶會看到我在下面的狀態表:

Table in the intial state

用戶只會看到三個選項卡,這表都是空的。

用內容填充表是用戶的工作。從JList採摘的元素,並將其提交之後,該表被填充方式如下:

Table filled with data

每個後從JList提交所選元素的,它會被直接顯示在JTable。我通過設置JTableDefaultTableModel來做到這一點。因此,顯示輸入的元素像預期一樣工作。只有標題不顯示在條目上方。

編輯2:SSCCE

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Font; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTabbedPane; 
import javax.swing.JTable; 
import javax.swing.ListSelectionModel; 
import javax.swing.border.BevelBorder; 
import javax.swing.border.SoftBevelBorder; 
import javax.swing.table.DefaultTableModel; 


public class GUIMain{ 

    private JFrame frmKeyoperateTestframework; 

    public JTable tableBefore; 
    public JTable tableMainTest; 
    public JTable tableAfter; 

    public JTabbedPane tabbedPane; 
    public JScrollPane scrollTables; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        GUIMain window = new GUIMain(); 
        window.frmKeyoperateTestframework.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the application. 
    */ 
    public GUIMain() { 
    initialize(); 
} 

/** 
* Initialize the contents of the frame. 
*/ 
private void initialize() { 

    frmKeyoperateTestframework = new JFrame(); 
    frmKeyoperateTestframework.setResizable(false); 
    frmKeyoperateTestframework.getContentPane().setBackground(Color.WHITE); 
    frmKeyoperateTestframework.setFont(new Font("Carlito", Font.PLAIN, 14)); 
    frmKeyoperateTestframework.setTitle("GUI"); 
    frmKeyoperateTestframework.setBounds(100, 100, 865, 584); 
    frmKeyoperateTestframework.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frmKeyoperateTestframework.getContentPane().setLayout(null); 

    tabbedPane = new JTabbedPane(JTabbedPane.TOP); 
    tabbedPane.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null)); 
    tabbedPane.setFont(new Font("Carlito", Font.PLAIN, 13)); 
    tabbedPane.setBackground(Color.WHITE); 
    tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); 

    scrollTables = new JScrollPane(); 
    scrollTables.setBounds(446, 50, 397, 490); 
    scrollTables.setViewportView(tabbedPane); 
    frmKeyoperateTestframework.getContentPane().add(scrollTables); 

    // "5" to show, that only data rows are displayed 
    DefaultTableModel tableModel = new DefaultTableModel(new String[]{"Client", "Action", "Location", "Value"}, 5); 

    tableBefore = new JTable(); 
    tableBefore.setName("tableBefore"); 
    tableBefore.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    tableBefore.setModel(tableModel); 
    tabbedPane.addTab("Before", null, tableBefore, null); 
    tableBefore.setFont(new Font("Carlito", Font.PLAIN, 13)); 
    tableBefore.setFocusable(false); 

    tableMainTest = new JTable(); 
    tableMainTest.setName("tableMainTest"); 
    tableMainTest.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    tableMainTest.setFont(new Font("Carlito", Font.PLAIN, 13)); 
    tableMainTest.setFocusable(false); 
    tableMainTest.setModel(tableModel); 
    tabbedPane.addTab("Main", null, tableMainTest, null); 
    tabbedPane.setEnabledAt(1, true); 

    tableAfter = new JTable(); 
    tableAfter.setName("tableAfter"); 
    tableAfter.setModel(tableModel); 
    tableAfter.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    tabbedPane.addTab("After", null, tableAfter, null); 
    tableAfter.setFont(new Font("Carlito", Font.PLAIN, 13)); 
    tableAfter.setFocusable(false); 

    tabbedPane.setSelectedComponent(tableMainTest); 
} 
} 
+0

你能提供一個可運行的例子([SSCCE(HTTP:// sscce.org)),所以我可以重現你的問題,並嘗試修復它? –

+0

@SergiyMedvynskyy我加了一個SSCCE。看到我更新的帖子。我知道,問題可能在於,表格不是直接在'JScrollPane'裏面,我已經試着移動它們,但是我再也看不到我的標籤了。 – KJaeg

回答

7

我自己找到了解決辦法。解決方案是簡單地爲每個表使用JScrollPane,其包含在JTabbedPane中。之前,整個JTabbedPane被封裝在JScrollPane中。現在,每個選項卡都保存JScrollPane而不是JTable。雖然拆除舊的JScrollPane並將表格打包成一個自己的表格聽起來很簡單,但需要花費一些努力來更改剩餘的代碼,修復它,並將新代碼適用於GUI佈局。

我發現了一個很好的代碼示例,它應該如何看起來像here

下面你可以找到一個代碼示例JTabbedPane的組合,JScrollPaneJTables怎麼也看喜歡的工作:

tabbedPane = new JTabbedPane(JTabbedPane.TOP); 
    tabbedPane.setBounds(446, 50, 397, 490); 
    tabbedPane.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null)); 
    tabbedPane.setFont(new Font("Carlito", Font.PLAIN, 13)); 
    tabbedPane.setBackground(Color.WHITE); 
    frame.getContentPane().add(tabbedPane); // JFrame 

    tableMainTest = new JTable(); 
    tableMainTest.setName("tableMainTest"); 
    tableMainTest.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    tableMainTest.setFont(new Font("Carlito", Font.PLAIN, 13)); 
    tableMainTest.setFocusable(false); 
    tableMainTest.setModel(tableModel); 

    tableMainTest.setPreferredScrollableViewportSize(tableMainTest.getPreferredSize()); 
    tableMainTest.changeSelection(0, 0, false, false); 
    tableMainTest.setAutoCreateRowSorter(true); 

    JScrollPane scrollMain = new JScrollPane(tableMainTest); 
    scrollMain.add(tableMainTest.getTableHeader()); 
    scrollMain.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 
    scrollMain.setBounds(446, 50, 397, 490); 

    tabbedPane.addTab(descrTableMain, scrollMain);