2015-07-08 3 views
2

Таким образом, я создал 2 JFramesJPanel оленью кожу позволяют компоненте позиционировании

Person

Work Detail

Но потом я понял, 2 JFrames не является хорошим idea.So я добавил JTabbedPane, а затем попытался добавить в разных вкладки в форме 'JPanel. Но я не могу позиционировать компоненты так, как я сделал в Jframe, и это выглядит так.

Main Menu

Но я хочу, чтобы это было так

Expected Main Menu

Как я могу это сделать?

+0

Используйте надлежащий механизм макета для JPanel? Например. [GridBagLayout] (http://docs.oracle.com/javase/7/docs/api/java/awt/GridBagLayout.html) – Gosu

ответ

7

Без рабочего примера, кажется, вы оставили раскладку по умолчанию для JPanel (который является FlowLayout).

Начните с создания пользовательской панели для каждого из ваших видов, это упростит управление и применит их к JTabbedPane.

Для вашего immeditate вопроса макета, я бы рекомендовал GridBagLayout для своей мощности и гибкости ...

LayoutLayout

import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       JTabbedPane tp = new JTabbedPane(); 
       tp.add("Person", new JPanel()); 
       tp.add("Work Detail", new TestPane()); 

       frame.add(tp); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JTextField name; 
     private JTextField serial; 
     private JTextField id; 
     private JTextField email; 

     private JComboBox level; 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.anchor = GridBagConstraints.EAST; 
      gbc.insets = new Insets(2, 2, 2, 2); 

      add(new JLabel("Name"), gbc); 
      gbc.gridx += 2; 
      add(new JLabel("Sr No"), gbc); 
      gbc.gridx = 0; 
      gbc.gridy++; 
      add(new JLabel("ID"), gbc); 
      gbc.gridx += 2; 
      add(new JLabel("Email ID"), gbc); 

      name = new JTextField(10); 
      serial = new JTextField(10); 
      id = new JTextField(10); 
      email = new JTextField(10); 

      level = new JComboBox(new String[]{"Manager", "Eng Lead", "Eng Designer", "Jr Designer"}); 

      gbc.anchor = GridBagConstraints.WEST; 
      gbc.gridx = 1; 
      gbc.gridy = 0; 
      add(name, gbc); 
      gbc.gridx += 2; 
      add(serial, gbc); 
      gbc.gridx = 1; 
      gbc.gridy++; 
      add(id, gbc); 
      gbc.gridx += 2; 
      add(email, gbc); 

      gbc.gridx = 0; 
      gbc.gridy++; 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      add(level, gbc); 

      gbc.gridy++; 
      gbc.anchor = GridBagConstraints.CENTER; 
      add(new JButton("Save"), gbc); 
     } 

    } 

} 
+0

Я использовал 'GridBagLayout', как вы и предполагали, но проблема в том, что ширина столбца ниже компонент должен быть таким же, как и выше. Как я могу это изменить? – 2FaceMan

+0

Congrats, MadProgrammer, по достижении 200K :-) @livinggourmand: попробуйте «GridBagConstraints» как «gridwidth/gridheight», чтобы увеличить ширину столбца. –

+0

@nIcE cOw Как только я устанавливаю ширину столбца для строки, столбец ниже этой строки не принимает никакого другого значения для ширины – 2FaceMan

2

Это тот, который я использовал недавно. Просто используйте макет, который вы хотите (MigLayout был моим выбором здесь).

JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); 

JPanel pnlOne = new JPanel(); 
tabbedPane.addTab("Tab One Name", null, pnlOne, null); 
pnlOne.setLayout(new MigLayout("", "[644.00,grow][50px:n,grow][]","[grow][]")); 

JPanel pnlTwo = new JPanel(); 
tabbedPane.addTab("Tab Two Name", null, pnlTwo, null); 
pnlTwo.setLayout(new MigLayout("", "[grow][]", "[grow][]")); 
Смежные вопросы