【问题标题】:Why won't this Swing tabbed pane display?为什么这个 Swing 选项卡式窗格不显示?
【发布时间】:2009-08-22 02:55:25
【问题描述】:

当 JFrame.setvisible 设置为 true 时,有人可以解释我的 JTabbedPane 不显示的类有什么问题吗?

是的,程序的main方法(这里就不放了)使用事件调度线程来启动ArionGUI。

这是我的 JFrame 代码:

import javax.swing.*;


public class ArionGUI extends JFrame {

    public ArionGUI() {
        // Set up GUI frame for Arion
        JFrame arionFrame = new JFrame("Arion v 0.01");
        // Add Arion Tabbed Pane
        arionFrame.getContentPane().add(new ArionTabbedPane());
        // Terminate the application when closed
        arionFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        // Set the size of the frame
        arionFrame.setSize(500, 500);
        // Center window
        arionFrame.setLocationRelativeTo(null);
        // Prevent user from resizing window
        arionFrame.setResizable(false);
        // Make Arion frame visible on screen
        arionFrame.setVisible(true);                
    }
} 

这是我的 JTabbedPane 代码:

import javax.swing.JTabbedPane;
import javax.swing.JLabel;
import javax.swing.JComponent;

public class ArionTabbedPane extends JComponent {

    JTabbedPane arionTabbedPane;

    public ArionTabbedPane() {

        arionTabbedPane = new JTabbedPane(JTabbedPane.TOP);
        arionTabbedPane.addTab("Characters", new JLabel("This is the characterz tab"));
        arionTabbedPane.addTab("Miscellaneous", new JLabel("This is the miscellaneous tab"));
        add(arionTabbedPane);

    }

}

【问题讨论】:

    标签: java swing class jtabbedpane


    【解决方案1】:

    因为 ArionTabbedPane 实际上并不是一个选项卡式窗格。这是一个包装。因此,您只是将一个组件添加到您的 JFrame 而不是 TabbedPane。如果您希望能够将 ArionTabbed 窗格添加到您的 JFrame,则需要扩展 JTabbedPane。如果要添加它要包装的窗格,则需要一个函数来返回对其内部选项卡式窗格的引用,并且需要将其添加到 JFrame 中。像这样的:

    ArionTabbedPane tabbedPane = new ArionTabbedPane();
    arionFrame.getContentPane().add(tabbedPane.getPane());
    

    ArionTabbedPane.getPane() 是这样的:

    Public JTabbedPane getPane() {
    return arionTabbedPane;
    }
    

    编辑:嗯.. 如果您不想这样做,那么您可以做的另一件事是让 ArionTabbedPane 扩展 JPanel 而不是 JComponent。 Java 知道 JPanel 是一个容器,因此当它被添加到您的 JFrame 时,它​​应该检查 JPanel 内部是否有要显示的内容。您唯一需要更改的就是让 ArionTabbedPane 扩展 JPanel 而不是 JComponent。

    再次编辑,如果您扩展 JTabbedPane,那么您需要删除内部 JTabbedPane。新的 ArionTabbedPane 应如下所示:

    公共类 ArionTabbedPane 扩展 JTabbedPane {

    public ArionTabbedPane() {
        super(JTabbedPane.TOP); // Calls JTabbedPane's constructor.
        this.addTab("Characters", new JLabel("This is the characterz tab"));
        this.addTab("Miscellaneous", new JLabel("This is the miscellaneous tab"));
    }
    

    }

    真的简单多了。

    【讨论】:

    • +1 我必须重新创建代码才能看到问题...做得好
    • 谢谢。您最初的回答 ArionTabbedPane 应该扩展 JTabbedPane 的工作原理!这就是我所需要的。
    • 但要小心,如果要扩展 JTabbedPane,则需要删除内部 JTabbedPane。你不会再使用它了。你是新班级应该看起来像我现在要编辑的答案。
    【解决方案2】:

    【讨论】:

    • 谢谢奥斯卡,这很有帮助!
    猜你喜欢
    • 1970-01-01
    • 2019-11-15
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    相关资源
    最近更新 更多