移动到单独的类时,未正确创建JTabbedpane

时间:2014-10-14 14:59:09

标签: java swing jtabbedpane

在我的主类中初始化JTabbedpane时一切正常,但是为了不重复重复相同的代码,我想将初始化部分移动到单独的类,这样我就可以轻松地创建新的选项卡而不生成再次使用相同的代码。 不幸的是,在将代码移动到单独的类之后,JTabbedpane未正确创建,因为未显示添加到列表的项目。看起来JPanel没有加载,因为选项卡下的屏幕是灰色的(当它工作时它是白色的)。

以下是有效的代码:

private void initialize() {
    frmLoganalyzer = new JFrame();
    frmLoganalyzer.setTitle("LogAnalyzer");
    frmLoganalyzer.setBounds(100, 100, 450, 300);
    frmLoganalyzer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frmLoganalyzer.setExtendedState(frmLoganalyzer.getExtendedState() | JFrame.MAXIMIZED_BOTH);

    JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
    frmLoganalyzer.getContentPane().add(tabbedPane, BorderLayout.CENTER);

    JPanel systemLogTab = new JPanel();
    tabbedPane.addTab("System Log", null, systemLogTab, null);

    DefaultListModel listModel = new DefaultListModel<LogSystem>();

    systemLogTab.setLayout(new BorderLayout(0, 0));
    JList list = new JList(listModel);

    list.setCellRenderer(new CustomListCellRenderer());
    list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
    list.setLayoutOrientation(JList.VERTICAL);
    list.setVisibleRowCount(-1);

    JScrollPane listScroller = new JScrollPane(list);
    listScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    listScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

    systemLogTab.add(listScroller);
}

我试图把它看起来像这样:

private void initialize() {     
        frmLoganalyzer = new JFrame();
        frmLoganalyzer.setTitle("LogAnalyzer");
        frmLoganalyzer.setBounds(100, 100, 450, 300);
        frmLoganalyzer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frmLoganalyzer.setExtendedState(frmLoganalyzer.getExtendedState() | JFrame.MAXIMIZED_BOTH);

        JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
        frmLoganalyzer.getContentPane().add(tabbedPane, BorderLayout.CENTER);
        TabManager tabManager = new TabManager(tabbedPane);

        DefaultListModel listModel = new DefaultListModel<LogSystem>();

        tabManager.addTab("System Log", null, listModel);
}

在初学化标签的课程中:

    public void addTab(String tabName, Icon icon, DefaultListModel<LogSystem> listModel) {  
        JPanel systemLogTab = new JPanel();
        tabbedPane.addTab(tabName, null, systemLogTab, null);

        systemLogTab.setLayout(new BorderLayout(0, 0));
        JList<LogSystem> list = new JList(listModel);

        list.setCellRenderer(new CustomListCellRenderer());
        list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        list.setLayoutOrientation(JList.VERTICAL);
        list.setVisibleRowCount(-1);

        JScrollPane listScroller = new JScrollPane(list);
        listScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        listScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        systemLogTab.add(listScroller);
}

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我删除了许多与GUI无关的代码,并且必须更改addTab方法定义,因为tabbedPane不可见。它工作正常:

public class Example {

    @SuppressWarnings("serial")
    private static void initialize() {

        JFrame frmLoganalyzer = new JFrame();
        frmLoganalyzer.setTitle("LogAnalyzer");
        frmLoganalyzer.setBounds(100, 100, 450, 300);
        frmLoganalyzer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTabbedPane tabbedPane = new JTabbedPane();
        frmLoganalyzer.getContentPane().add(tabbedPane);

        JPanel systemLogTab = new JPanel();
        tabbedPane.addTab("System Log", null, systemLogTab, null);

        systemLogTab.setLayout(new BorderLayout());

        JList list = new JList();
        JScrollPane listScroller = new JScrollPane(list);
        systemLogTab.add(listScroller);

        frmLoganalyzer.setVisible(true);
    }

    private static void initialize2() {

        JFrame frmLoganalyzer = new JFrame();
        frmLoganalyzer.setTitle("LogAnalyzer");
        frmLoganalyzer.setBounds(100, 100, 450, 300);
        frmLoganalyzer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTabbedPane tabbedPane = new JTabbedPane();
        frmLoganalyzer.getContentPane().add(tabbedPane);

        addTab("System Log", tabbedPane);
        frmLoganalyzer.setVisible(true);
    }

    public static void addTab(String tabName, JTabbedPane tabbedPane) {

        JPanel systemLogTab = new JPanel();
        tabbedPane.addTab(tabName, null, systemLogTab, null);
        systemLogTab.setLayout(new BorderLayout());

        JList list = new JList();
        JScrollPane listScroller = new JScrollPane(list);
        systemLogTab.add(listScroller);
    }

    public static void main(String[] args) {

        initialize(); // call initialize2() and see that it's the same
    }
}