JTabbedPane addTab在包装器方法中无法正常工作

时间:2013-10-22 06:38:07

标签: java swing layout jtabbedpane

作为我的软件开发文凭的一部分,我们必须创建一个Java GUI来管理足球联赛。我的小组已经制作了许多JPanels,我们在JTabbedPane中点击了原型。到目前为止,我正在将它们移动到单独的文件中并进入MVC布局。

我正在使用一个窗口类来保存顶级JFrame和菜单栏,并在标签窗格中添加。这在构造函数中工作正常但是当我从构造函数中删除它们并尝试通过Window.attachTabbedPanel(String name, JPanel panel)从引导程序添加它时它不会显示但查询tabbedPane.getTabCount()会显示递增数量的选项卡。

这是一个剥离的代码集: Bootstrap文件:

public class Bootstrap {

    private Window mainWindow;

    public Bootstrap() {

        //Window class is our containing JFrame and JMenuBar
        mainWindow = new Window();

        //Load up our view classes
        TestTab tab1 = new TestTab();
        TestTab tab2 = new TestTab();

        //Attach them
        mainWindow.attachTabbedPanel("Tab1", tab1.getScreen());
        mainWindow.attachTabbedPanel("Tab2", tab2.getScreen());

    } // Bootstrap()

    public gui.Window getWindow(){
        return mainWindow;
    }

} // Bootstrap

这由主文件调用:

public class Main {

    public static void main(String[] args) {

        Bootstrap RunMVC = new Bootstrap();
        gui.Window mainWindow = RunMVC.getWindow();
        mainWindow.run();
    } // main()

} // Main

问题从Window类开始,我已经在In Constructor标签中添加了以检​​查我没有填充tabbedPane但是它在那时工作正常。

public class Window {

    private JFrame frame;
    private JMenuBar menuBarMain;
    private JMenu mnFile;
    private JTabbedPane tabbedPane;
    private int count;
    /**
     * Create the application.
     */
    public Window() {

        //Build the frame
        frame = new JFrame();
        frame.setBounds(100, 100, 1280, 800);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new CardLayout(0, 0));
        //End Build frame

        TestTab conTab = new TestTab();

        //Add the tabbed pane to hold the top level screens
        tabbedPane = new JTabbedPane(JTabbedPane.TOP);    
        frame.getContentPane().add(tabbedPane, "name_1");
        tabbedPane.addTab("In Consructor", conTab.getScreen());
        count = 1;
    }

    public void attachTabbedPanel(String name, JPanel panel){
        System.out.println("Window: adding Jpanel name: "+name);
        System.out.println("panel is a: "+panel);
        tabbedPane.addTab(name, panel);
        tabbedPane.updateUI();
        System.out.println("Number of tabs: "+tabbedPane.getTabCount());
        System.out.println("Last Tab .isEnabledAt() "+tabbedPane.isEnabledAt(count++));
        tabbedPane.updateUI();
    }
    /**
     * Launch the window.
     */
    public void run() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Window window = new Window();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

最后小组:

public class TestTab {

    private JPanel screen;
    private JLabel lblSeason;
    private JButton btnEdit;
    private JLabel lblRounds;

    public JPanel getScreen() {
        return screen;
    }
    /**
     * Initialize the contents of the frame.
     */
    public TestTab() {

        screen = new JPanel();
        screen.setLayout(new MigLayout("", "[8%,right][10%,left][8%,right][10%,left][grow][50%]", "[][][grow]"));

        lblSeason = new JLabel("Test");
        screen.add(lblSeason, "flowx,cell 0 0");

        btnEdit = new JButton("Edit Test");
        screen.add(btnEdit, "cell 5 0,alignx right");

        lblRounds = new JLabel("More Testing");
        screen.add(lblRounds, "cell 0 1,alignx left");

    }

}

2 个答案:

答案 0 :(得分:0)

updateUI()没有按照您的想法行事。永远不应该直接调用它 - 它从超类构造函数调用,以允许Swing外观委托初始化自己。

取消对updateUI()的通话可以解决您的问题;或者如果选项卡式窗格已经在屏幕上,您可能需要强制重新绘制/重新验证 - 其咒语为invalidate(); revalidate(); repaint();

答案 1 :(得分:0)

您的错误在这里:

public void run() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Window window = new Window();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

您正在使用新的窗口实例,而不是使用之前创建的窗口,尝试使用此代码

 public void run() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }