2015-03-29 3 views
0

в приведенном ниже коде я пытаюсь создать вкладки.Как выровнять несколько jpanels друг под другом

1 - согласно приведенному ниже коду, jlabel содержит слово «Demo», во время выполнения оно не отображается! почему это происходит и как заставить эту jlabel появиться?

2-как вы видите в коде, функция createTab1() должна создавать jTextField и JPasswordField. во время выполнения они появляются, но они связаны друг с другом горизонтально, что я хочу, чтобы показать JTextField и его jlabel рядом друг с другом по горизонтали, а вторую jlabel и JpassworfField рядом друг с другом, но под jTextField и его jLabel, как показано ниже:

Labe  jtextField 
label jPasswordField 

, но код ниже привести графический интерфейс, показанный на this image

кодекса:

private void setUpGUI() { 
    // TODO Auto-generated method stub 
    jFrame_Main = new JFrame("Main Window"); 
    jPanel_ContainerPanel = new JPanel(new BorderLayout()); 
    jPanel_ContainerPanel.setBorder(BorderFactory.createLoweredBevelBorder()); 
    jLabel_ContainerLabel = new JLabel("Demo"); 
    jLabel_ContainerLabel.setHorizontalAlignment(SwingConstants.CENTER); 

    jPanel_ContainerPanel.add(jLabel_ContainerLabel, BorderLayout.NORTH); 

    createTab1(); 
    //createTab2(); 

    jTabbedPane = new JTabbedPane(); 
    jTabbedPane.add("tab1", jPanel1); 

    jFrame_Main.getContentPane().add(jPanel_ContainerPanel); 
    jFrame_Main.getContentPane().add(jTabbedPane); 
    jFrame_Main.pack(); 
    jFrame_Main.setVisible(true); 
} 

private void createTab1() { 
    // TODO Auto-generated method stub 
    jPanel1 = new JPanel(); 
    jPanel1.setBounds(10, 15, 150, 20); 
    jLabel1 = new JLabel("userName"); 
    jPanel1.add(jLabel1); 

    JTextField field = new JTextField(); 
    field.setBounds(10, 35, 150, 50); 
    jPanel1.add(field); 

    JLabel label2 = new JLabel("Password:"); 
    label2.setBounds(10, 60, 150, 20); 
    jPanel1.add(label2); 

    JPasswordField fieldPass = new JPasswordField(); 
    fieldPass.setBounds(10, 80, 150, 20); 
    jPanel1.add(fieldPass); 
} 

public static void main(String[] args) { 
    GUITabs guiTabs = new GUITabs(); 
} 

}

+1

почему бы вам не использовать NetBeans? вы можете легко создавать такие типы графических интерфейсов. – MeshBoy

+0

@MeshBoy на самом деле я еще не использовал его раньше, но предлагает ли он более удобные способы рисования gui, например, с помощью перетаскивания для примера ... потому что в настоящее время я использую eclipse – user2121

+1

. Да darg и drop включены в netbeans. Вы можете перетаскивать ярлыки кнопок панели и т. Д. В jframe и легко создавать GUI. – MeshBoy

ответ

1

Проблем:

  • Вы используете setBounds(...) для добавления компоненты к контейнеру (а JPanel), который по умолчанию использует FlowLayout, макет, который не уважает размер/положение/ограничивающее свойство его компонентов ,
  • В то время как да, вы можете использовать setBounds(...) на JPanel, который явно определен для использования макетов null. Я предлагаю вам не делать этого, поскольку это делает для очень негибкого GUI, что, хотя они могут выглядеть хорошо на одной платформе, выглядят ужасно на большинстве других платформ или разрешениях экрана, которые очень сложно обновить и поддерживать. Вместо этого вы захотите изучить и изучить менеджеров компоновки, а затем вложить JPanels, каждый из которых использует свой собственный менеджер компоновки для создания приятных и сложных графических интерфейсов, которые хорошо смотрятся на всех ОС.
  • Было предложено использовать перетаскивание NetBeans для создания сложных графических интерфейсов, и, хотя это будет работать, вы не поймете основные макеты, которые используют NetBeans и Swing, и, следовательно, в конечном итоге когда вам нужно выйти за пределы возможностей NetBeans, например, если вы хотите изменить макет или добавить компоненты в середине запуска программы. По этой причине вам намного лучше узнать и использовать менеджеров макетов. Вы можете найти учебник по дизайну макетов здесь: Layout Manager Tutorial, и вы можете найти ссылки на обучающие программы Swing и на другие ресурсы Swing: Swing Info.
  • Вам необходимо предоставить вашему JTextField и JPasswordField значение столбца через setColumn(int column). Это даст поле некоторую ширину.
  • Myself, я хотел бы использовать GridBagLayout поместить метки JLabel, JTextFields и JPasswordFields в ваши JPanel
  • Я также не получить имя пользователя и пароль из вкладки, а из модального диалога, таких как JOptionPane. Таким образом, пользователю не разрешается обращаться к вашему основному графическому интерфейсу, пока он не справится с модальным диалогом.

Например:

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.util.Arrays; 
import javax.swing.*; 

public class UserNamePassword { 
    private static final int COLUMN_COUNT = 10; 
    private static final int I_GAP = 3; 
    private JTextField userNameField = new JTextField(); 
    private JPasswordField passwordField = new JPasswordField(); 
    private JPanel mainPanel = new JPanel(new GridBagLayout()); 

    public UserNamePassword() { 
     userNameField.setColumns(COLUMN_COUNT); 
     passwordField.setColumns(COLUMN_COUNT); 

     GridBagConstraints gbc = getGbc(0, 0, GridBagConstraints.BOTH); 
     mainPanel.add(new JLabel("User Name:"), gbc); 
     gbc = getGbc(1, 0, GridBagConstraints.HORIZONTAL); 
     mainPanel.add(userNameField, gbc); 
     gbc = getGbc(0, 1, GridBagConstraints.BOTH); 
     mainPanel.add(new JLabel("Password:"), gbc); 
     gbc = getGbc(1, 1, GridBagConstraints.HORIZONTAL); 
     mainPanel.add(passwordField, gbc); 
    } 

    public static GridBagConstraints getGbc(int x, int y, int fill) { 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = x; 
     gbc.gridy = y; 
     gbc.gridwidth = 1; 
     gbc.gridheight = 1; 
     gbc.weightx = 1.0; 
     gbc.weighty = 1.0; 
     gbc.insets = new Insets(I_GAP, I_GAP, I_GAP, I_GAP); 
     gbc.fill = fill; 

     return gbc; 
    } 

    public String getUserName() { 
     return userNameField.getText(); 
    } 

    public char[] getPassword() { 
     return passwordField.getPassword(); 
    } 

    public JComponent getMainPanel() { 
     return mainPanel; 
    } 

    private static void createAndShowGui() { 
     UserNamePassword project2 = new UserNamePassword(); 

     int input = JOptionPane.showConfirmDialog(null, project2.getMainPanel(), 
      "Login", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); 
     if (input == JOptionPane.OK_OPTION) { 
     if (project2.getUserName().equals("username") && 
       Arrays.equals(project2.getPassword(), "password".toCharArray())) { 
      // you're good 
     } else { 
      JOptionPane.showMessageDialog(project2.getMainPanel(), 
        "error message", "Error Title", JOptionPane.ERROR_MESSAGE); 
     } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
}