簡體   English   中英

表頭未顯示

[英]Table header is not shown

我的錯誤是我的兩個表的表頭未顯示。 現在,我使用new JTable(data, columnNames)設置標題。

這是一個顯示我的問題的示例:

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;
import net.miginfocom.swing.MigLayout;

public class Test extends JFrame {

    private static final long serialVersionUID = -4682396888922360841L;
    private JMenuBar menuBar;
    private JMenu mAbout;
    private JMenu mMain;
    private JTabbedPane tabbedPane;
    public SettingsTab settings = new SettingsTab();

    private void addMenuBar() {
        menuBar = new JMenuBar();
        mMain = new JMenu("Main");
        mAbout = new JMenu("About");
        menuBar.add(mMain);
        menuBar.add(mAbout);
        setJMenuBar(menuBar);
    }

    public void createTabBar() {
        tabbedPane = new JTabbedPane(JTabbedPane.TOP);
        tabbedPane.addTab("Settings", settings.createLayout());
        add(tabbedPane);
        tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
    }

    private void makeLayout() {
        setTitle("Test");
        setLayout(new BorderLayout());
        setPreferredSize(new Dimension(1000, 500));
        addMenuBar();
        createTabBar();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public void start() {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                makeLayout();
            }
        });
    }

    public static void main(String[] args) {
        Test gui = new Test();
        gui.start();
    }

    public class SettingsTab extends JPanel {

        public JScrollPane createLayout() {
            JPanel panel = new JPanel(new MigLayout(""));
            JScrollPane sp = new JScrollPane(panel);
            sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
            panel.add(table1(), "growx, wrap");
            panel.add(Box.createRigidArea(new Dimension(0, 10)));
            panel.add(table2());
            //          panel.add(Box.createRigidArea(new Dimension(0,10)));
            return sp;
        }

        public JPanel table1() {
            JPanel panel1 = new JPanel();
            String[] columnNames = {"First Name", "Last Name"};
            Object[][] data = {{"Kathy", "Smith"}, {"John", "Doe"},
                {"Sue", "Black"}, {"Jane", "White"}, {"Joe", "Brown"},
                {"John", "Doe"}, {"Sue", "Black"}, {"Jane", "White"},
                {"Joe", "Brown"}};
            final JTable table = new JTable(data, columnNames);
            tableProperties(table);
            panel1.add(table);
            panel1.setLayout(new BoxLayout(panel1, BoxLayout.Y_AXIS));
            return panel1;
        }

        public JPanel table2() {
            JPanel panel1 = new JPanel();
            String[] columnNames = {"First Name", "Last Name"};
            Object[][] data = {{"Kathy", "Smith"}, {"John", "Doe"},
                {"Sue", "Black"}, {"Jane", "White"}, {"Joe", "Brown"},
                {"John", "Doe"}, {"Sue", "Black"}, {"Jane", "White"},
                {"Joe", "Brown"}};
            final JTable table = new JTable(data, columnNames);
            table.setPreferredScrollableViewportSize(new Dimension(500, 70));
            table.setFillsViewportHeight(true);
            tableProperties(table);
            panel1.add(table);
            panel1.setLayout(new BoxLayout(panel1, BoxLayout.Y_AXIS));
            return panel1;
        }

        public void tableProperties(JTable table) {
            table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
            table.repaint();
            table.revalidate();
        }
    }
}

有什么建議我做錯了嗎?

  • JTableHeader需要將JScrollPane作為容器

  • 您必須從JTable獲取JTableHeader並將其放置,並單獨放置,例如panel.add(table1.getTableHeader(), "constant, constant, constant"); ,可以使用BorderLayout作為比BoxLayout更好,更簡單的JPanel LayoutManager ,例如panel.add(table1.getTableHeader(), BorderLayout.NORTH); ,然后將JTable放在CENTER區域

  • 更好的應該是-不要在JScrollPane使用JPanel ,將JTable直接放到JScrollPane ,那么JTableHeader是可見的,否則必須為JPanel實現Scrollable才能自然滾動


  • MigLayout用於整個容器(已指定用於),不需要使用此自定義LayoutManager來混合不同的LayoutManagers

  • 使用DefaultTableModelJTable的視圖存儲值

  • 請參見Oracle tutorial Initial Thread

  • JScrollPane使用setPreferredScrollableViewportSize

  • 您對PreferredSize的設置將創建**** Swing GUI


  • void tableProperties包含兩個無用的代碼行table.repaint(); table.revalidate(); 並以錯誤的順序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM