在JPanel中设置方向

时间:2014-10-27 11:30:46

标签: java swing user-interface jpanel

我正在尝试使用嵌套的JPanel,然后我可以在我的应用程序的不同部分重用它,例如页面顶部的导航栏。我无法设置项目的方向,例如我希望按钮位于文本字段上方。

如果我单独创建它们并将它们直接添加到JPanel中,那么它们将作为一个整体出现在另一个之上,如下所示:

    final JFrame frame = new JFrame("Nested Layout Example");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      final JPanel gui = new JPanel(new BorderLayout(5,5));
                    gui.setBorder( new TitledBorder("BorderLayout(5,5)") );

                    JButton button = new JButton("Button");
                    JButton button1 = new JButton("Button1");
                    gui.add(button, BorderLayout.NORTH);
                    gui.add(button1, BorderLayout.SOUTH);

 frame.setContentPane(gui);

                frame.pack();

                frame.setLocationRelativeTo(null);
                try {
                    // 1.6+
                    frame.setLocationByPlatform(true);
                    frame.setMinimumSize(frame.getSize());
                } catch(Throwable ignoreAndContinue) {
                }

                frame.setVisible(true);

但是,如果我创建一个嵌套的JPanel并将其放在另一个JPanel中,那么我可以重用它,它们并排出来,如下所示:

 final JFrame frame = new JFrame("Nested Layout Example");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                final JPanel gui = new JPanel(new BorderLayout(5,5));
                gui.setBorder( new TitledBorder("BorderLayout(5,5)") );

                JPanel container = new JPanel();
                JButton button = new JButton("Button");
                JButton button1 = new JButton("Button1");
                container.add(button, BorderLayout.NORTH);
                container.add(button1, BorderLayout.SOUTH);

                gui.add(container);

               frame.setContentPane(gui);

                frame.pack();

                frame.setLocationRelativeTo(null);
                try {
                    // 1.6+
                    frame.setLocationByPlatform(true);
                    frame.setMinimumSize(frame.getSize());
                } catch(Throwable ignoreAndContinue) {
                }

                frame.setVisible(true);

我尝试过设置componentsnetOrientation,

container.setComponentOrientation(ComponentOrientation.);

但没有垂直

的选项

2 个答案:

答案 0 :(得分:1)

  

我尝试过设置componentsnetOrientation

请注意问题与组件方向无关:这是布局管理器问题,如下所述。

  

但是,如果我创建一个嵌套的JPanel并将其放在另一个JPanel中,那么我可以重用它,它们并排出来

下面:

JPanel container = new JPanel();
...
container.add(button, BorderLayout.NORTH);
container.add(button1, BorderLayout.SOUTH);

面板的默认布局管理器为FlowLayout,它将忽略BorderLayout个约束。您必须将BorderLayout设置为布局管理器,不仅要设置到gui面板,还要设置为container面板。

JPanel container = new JPanel(new BorderLayout());
...
container.add(button, BorderLayout.NORTH);
container.add(button1, BorderLayout.SOUTH);

答案 1 :(得分:0)

尝试为JPanel设置布局。包 java.awt 中有许多可用的布局。其中一些是BorderLayout,GridBagLayout,CardLayout,FlowLayout,GridLayout。

我刚刚为您的代码添加了一行,现在,它按照您想要的方式添加按钮:

        final JFrame frame = new JFrame("Nested Layout Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JPanel gui = new JPanel(new BorderLayout(5,5));
        gui.setBorder( new TitledBorder("BorderLayout(5,5)") );

        JPanel container = new JPanel();

        container.setLayout(new GridLayout(2,1)); // This is the line that I have added.

        JButton button = new JButton("Button");
        JButton button1 = new JButton("Button1");
        container.add(button, BorderLayout.NORTH);
        container.add(button1, BorderLayout.SOUTH);

        gui.add(container);

        frame.setContentPane(gui);

        frame.pack();

        frame.setLocationRelativeTo(null);
        try {
              // 1.6+
              frame.setLocationByPlatform(true);
              frame.setMinimumSize(frame.getSize());
        } catch(Throwable ignoreAndContinue) {
        }

        frame.setVisible(true);

如果要添加更多按钮,可以编辑该行。 GridLayout的构造函数方法的第一个参数是垂直列的数量,第二个是水平列的数量。