【问题标题】:Java Swing Boxlayout: having panels of different sizes (ratio to each other)Java Swing Boxlayout:具有不同大小的面板(彼此比例)
【发布时间】:2013-11-03 03:54:13
【问题描述】:

我正在尝试创建一个 boxlayout 面板,其中有 2 个其他面板,其中一个只有另一个的一半大小(因此比例为 1/3 到 2/3)。设置首选大小似乎不起作用,我无法找出任何其他方式(以下代码主要是使用 Windowbuilder 生成的,如果有点混乱,请道歉):

public class GUIControls extends JFrame implements IGUIControls {
    private JTextField textField;

    private int posX=0,posY=0;

    public GUIControls() {

        getContentPane().setBackground(Color.WHITE);
        getContentPane().setLayout(new CardLayout(0, 0));

        JPanel rootPanel = new JPanel();
        rootPanel.setBorder(new LineBorder(new Color(0, 0, 255), 1, true));
        rootPanel.setBackground(Color.WHITE);
        getContentPane().add(rootPanel, "name_25253210045969");
        rootPanel.setLayout(new BoxLayout(rootPanel, BoxLayout.X_AXIS));
        rootPanel.setPreferredSize(new Dimension(600, 400));

        JPanel menuLeft = new JPanel();
        rootPanel.add(menuLeft);
        menuLeft.setBackground(Color.WHITE);
        menuLeft.setLayout(null);
        menuLeft.setPreferredSize(new Dimension((1/3)*rootPanel.getWidth(), rootPanel.getHeight()));

        JPanel contentRight = new JPanel();
        rootPanel.add(contentRight);
        contentRight.setBackground(Color.WHITE);
        contentRight.setPreferredSize(new Dimension((2/3)*rootPanel.getWidth(), rootPanel.getHeight()));
        contentRight.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent arg0) {
                CardLayout cardLayout = (CardLayout) getContentPane().getLayout();
                cardLayout.show(getContentPane(), "name_36737116256884");
            }
        });
        contentRight.setLayout(null);

        setUndecorated(true);   

        addMouseListener(new MouseAdapter()
        {
           public void mousePressed(MouseEvent e)
           {
              posX=e.getX();
              posY=e.getY();
           }
        });

        addMouseMotionListener(new MouseAdapter()
        {
             public void mouseDragged(MouseEvent evt)
             {
                //sets frame position when mouse dragged            
                setLocation (evt.getXOnScreen()-posX,evt.getYOnScreen()-posY);

             }
        });

    }

    public void runGUI(){
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                GUIControls guiControls = new GUIControls();
                guiControls.pack();
                guiControls.setLocationRelativeTo(null);
                guiControls.setSize(600, 400);
                guiControls.setVisible(true);
            }
        });
    }
}

有人知道我会怎么做吗?

谢谢。

【问题讨论】:

  • Setting preferred size doesn't seem to work - 对我来说听起来像是一个合理的解决方案。发布您的SSCCE,说明您使用此方法时遇到的问题。
  • 我已经添加了我试图做的事情,但仍然没有运气。
  • 那不是SSCCE,所以我帮不上忙。
  • 好吧,好吧,好吧。我不太确定什么代码是相关的,所以我添加了其余的,没有那么多,但那是可能导致这种情况的一切(我猜与 SSCCE 相反,但我不是真的很确定如何在不知道问题出在哪里的情况下减少它)。
  • I guess, but I'm not really sure how to cut this down without knowing where the problem is) - 您发布了演示问题所需的最少代码量。 KeyListener 或 MouseListener 与问题有何关系?你有一个布局问题。所以你需要一个带有 BoxLayout 的面板。然后,您添加了两个子面板。你有一个框架。不要把问题复杂化。 SSCCE 的目的是简化问题。无论如何,您已经做出了努力,所以请参阅我的答案的编辑。

标签: java swing jpanel windowbuilder boxlayout


【解决方案1】:

您可以尝试使用GridBagLayout。阅读 How to Use GridBagLayout 上的 Swing 教程中的部分以获取更多信息。我猜你需要使用weightx 属性。

或者您可以使用专门为此设计的Relative Layout

编辑:

您是否进行了任何调试?添加时会发生什么:

System.out.println(menuLeft.getPreferredSize());
System.out.println(contentRight.getPreferredSize());

你有两个问题:

  1. 1/3 的值是多少?您需要修正您的尺寸计算。
  2. 您的 rootPanel 的大小是多少?在组件显示在可见 GUI 上之前,组件没有大小。您可以设置组件的首选大小。

【讨论】:

  • 好的,所以我通过对宽度进行硬编码而不是使用 getWidth() 解决了这个问题(当我尝试调整窗口大小时,这可能会导致问题,但是嗯)。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
相关资源
最近更新 更多