2016-07-13 1 views
2

JTabbedPane의 탭에 3 개의 표가 있습니다. JTabbedPaneJScrollPane입니다. 각 테이블에 대해 스키마 {"Client", "Action", "Location", "Value"}을 따르는 수정 테이블 헤더를 보여주고 싶습니다. ActionListener (나중에 참조)에 헤더를 설정하려고했지만 다른 방법 (예 : 헤더를 처음에 설정)은 무료입니다.탭이있는 JTable의 표 머리글을 표시 할 수 없습니다.

다른 SO 게시물은 동일한 문제를 다루고 있지만 테이블 헤더를 표시 할 수 없습니다. 작동중인 유일한 것은 언급 된 ActionListener의 테이블에 데이터를 추가하는 것입니다. 헤더를 나타내는 String 배열과 함께 String -matrix 형식으로 데이터를 전달할 때 헤더가 표시되지 않는 이유는 알 수 없습니다.

처음에는 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); 

은 다시 코드이지만 JTable에 요소를 추가하는 버튼에 첨가 언급 ActionListener에서 이번에. 현재 나는 하나의 테이블로 작동하도록 노력하고 있습니다 : tableMainTest. 문자열 배열

  • dataMatrixMain의 목록은 String -matrix는

    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); 
    
    • header 양식 {"Client", "Action", "Location", "Value"}
    • itemListMainString -array 임 : 그래서 내가 테이블 헤더를 정의하려고 방법 내 테이블에 데이터를 채우기 위해 사용됩니다.

    아무도 알고 있나요? 헤더를 보이게하려면?

    편집 :

    프로그램이 다음과 같은 상태에서 내 테이블을 볼 수 있습니다 사용자를 시작

    :

    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 실행 가능한 예제를 제공 할 수 있습니다 : 당신이 아래

    JTabbedPane의 조합하는 JScrollPaneJTables 일을 같이하는 방법 코드 예제를 찾을 수 있습니다 // sscce.org)), 그래서 당신의 문제를 재현하고 그것을 고칠 수 있습니까? –

    +0

    @SergiyMedvynskyy SSCCE를 추가했습니다. 내 업데이트 된 게시물을 참조하십시오. 그 문제는 테이블이'JScrollPane'의 내부에 직접 있지 않고 이미 이동하려고 시도했지만 다음으로는 더 이상 내 탭을 볼 수 없다는 것을 알 수 있습니다. – KJaeg

    답변

    7

    은 나 자신에 의해 해결책을 발견했다. 이 솔루션은 JTabbedPane에 포함 된 각 테이블에 대해 JScrollPane을 사용했습니다.이전에는 전체 JTabbedPaneJScrollPane에 싸여있었습니다. 이제 각 탭에는 JTable 대신 JScrollPane이 저장됩니다. 오래된 JScrollPane을 제거하고 테이블을 자신의 것으로 압축하는 것은 간단하지만, 나머지 코드를 수정하고 수정하고 새로운 코드를 GUI 레이아웃에 맞추려면 약간의 노력이 필요합니다.

    좋은 코드 예제를 찾았습니다. 그 모양은 here입니다.

    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); 
    
    관련 문제