【问题标题】:JTabbedpane is not correctly created when moved to separate class移动到单独的类时未正确创建 JTabbedpane
【发布时间】:2014-10-14 14:59:09
【问题描述】:

在我的主类中初始化 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);
}

我做错了什么?

【问题讨论】:

  • 您的代码无法编译,请删除不需要的部分。在发布之前始终将您的代码复制粘贴到您的 IDE 中,以验证我们可以自己运行它。

标签: java swing jtabbedpane


【解决方案1】:

我删除了很多与 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
    }
}

【讨论】:

  • 感谢您的回答!多亏了你,我发现了我的错误在哪里。我错误地在我的代码中更深地分配了 JScrollPane 的新实例(不幸的是我没有将它粘贴到这里)。不管怎样,谢谢你的回答,它帮助我解决了我的问题!
猜你喜欢
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
相关资源
最近更新 更多