2013-11-02 2 views
0

Я пытаюсь создать панель boxlayout с двумя другими панелями внутри него, одна из которых только в два раза меньше другой (так что соотношение 1/3 до 2/3). Настройка предпочтительного размера, кажется, не работает, и я не мог понять, какой-либо другой путь (следующий код в основном генерируются с Windowbuilder, так извинения, если это немного беспорядка):Java Swing Boxlayout: с панелями разных размеров (отношение друг к другу)

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_045969"); 
     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); 
      } 
     }); 
    } 
} 

ли кто-нибудь знает, как я буду заниматься этим?

Спасибо.

+0

'Настройка предпочтительного размера, похоже, не работает' - звучит как разумное решение для меня. Опубликуйте свой «SSCCE», который демонстрирует проблему при использовании этого подхода. – camickr

+0

Я добавил в то, что я попытался сделать, но пока не повезло. – djcmm476

+0

Это НЕ 'SSCCE', поэтому я не могу помочь. – camickr

ответ

2

Вы можете попробовать использовать GridBagLayout. Прочтите раздел из учебника Swing по телефону How to Use GridBagLayout для получения дополнительной информации. Я бы предположил, что вам нужно будет сыграть с weightx.

Или вы можете использовать Relative Layout, который был специально разработан для этого.

Edit:

Занимались ли вы отладки? Что происходит, когда вы добавляете:

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

У вас есть две проблемы:

  1. Какова стоимость 1/3? Вам нужно исправить ваш расчет размера.
  2. Каков размер вашей rootPanel? Компонент не имеет размера, пока компонент не будет отображаться в видимом графическом интерфейсе. Вы задаете предпочтительный размер компонента.
+0

Хорошо, поэтому я исправил проблему с помощью жесткого кодирования по ширине, а не с помощью getWidth() (что может вызвать проблемы при попытке сделать изменение размера окна, но eh). Большое спасибо за помощь. – djcmm476

Смежные вопросы