2016-08-22 2 views
2

Ich versuche, einige Java-Fähigkeiten zurück zu bekommen, weil ich für eine lange Zeit in webdevelopment gearbeitet habe. Jetzt erstelle ich einfach einen Haupt-Jframe, wo ein kleines Menü ist und eine Klasse createSchueler erweitert JPanel.Ich habe versucht, ein JPanel zu meinem JFrame bei Klick hinzuzufügen, aber ich finde meinen Fehler nicht

Also, was ich tun möchte, wenn Sie das Menü klicken Neu gehen in> Schueler

Ein neues JPanel erstellt werden soll und zu dem Fenster

Hauptklasse

public class MainWindow { 

private JFrame frame; 


/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       MainWindow window = new MainWindow(); 
       window.frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the application. 
*/ 
public MainWindow() { 
    initialize(); 
} 

/** 
* Initialize the contents of the frame. 
*/ 
private void initialize() { 
    frame = new JFrame(); 
    frame.setBounds(100, 100, 807, 541); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(null); 

    JPanel createSchueler = new createSchueler(); 

    JMenuBar menuBar = new JMenuBar(); 
    frame.setJMenuBar(menuBar); 

    JMenu mnNewMenu = new JMenu("Neu"); 
    mnNewMenu.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      createSchueler.setVisible(true); 
      frame.getContentPane().add(createSchueler); 

     } 
    }); 
    menuBar.add(mnNewMenu); 

    JMenuItem mntmSchler = new JMenuItem("Sch\u00FCler"); 
    mnNewMenu.add(mntmSchler); 

    JMenu mnBearbeiten = new JMenu("Bearbeiten"); 
    menuBar.add(mnBearbeiten); 

    JMenuItem mntmSchler_1 = new JMenuItem("Sch\u00FCler"); 
    mnBearbeiten.add(mntmSchler_1); 


    } 
} 

Die createSchueler Klasse erweitert JPanel, die ich dem Rahmen hinzufügen möchte

public class createSchueler extends JPanel { 
private JTextField textField; 
private JTextField textField_1; 
private JTextField textField_2; 

/** 
* Create the panel. 
*/ 
public createSchueler() { 
    setLayout(null); 

    JLabel lblNeuenSchuelerErstellen = new JLabel("Neuen Schueler erstellen"); 
    lblNeuenSchuelerErstellen.setFont(new Font("Tahoma", Font.PLAIN, 22)); 
    lblNeuenSchuelerErstellen.setBounds(29, 27, 268, 27); 
    add(lblNeuenSchuelerErstellen); 

    JLabel lblVorname = new JLabel("Vorname"); 
    lblVorname.setBounds(29, 102, 46, 14); 
    add(lblVorname); 

    textField = new JTextField(); 
    textField.setBounds(97, 99, 172, 20); 
    add(textField); 
    textField.setColumns(10); 

    JLabel lblNachname = new JLabel("Nachname"); 
    lblNachname.setBounds(29, 133, 69, 14); 
    add(lblNachname); 

    textField_1 = new JTextField(); 
    textField_1.setBounds(97, 130, 172, 20); 
    add(textField_1); 
    textField_1.setColumns(10); 

    JLabel lblGeburtstag = new JLabel("Geburtstag"); 
    lblGeburtstag.setBounds(29, 169, 69, 14); 
    add(lblGeburtstag); 

    textField_2 = new JTextField(); 
    textField_2.setBounds(97, 166, 172, 20); 
    add(textField_2); 
    textField_2.setColumns(10); 

    ButtonGroup bg = new ButtonGroup(); 

    JRadioButton rdbtnMnnlich = new JRadioButton("M\u00E4nnlich"); 
    rdbtnMnnlich.setBounds(29, 206, 69, 23); 
    bg.add(rdbtnMnnlich); 

    JRadioButton rdbtnWeiblich = new JRadioButton("Weiblich"); 
    rdbtnWeiblich.setBounds(97, 206, 109, 23); 
    bg.add(rdbtnWeiblich); 



    } 
} 

Everything g ist wichtig, hoffentlich: D

Antwort

4

Verwenden Sie ein CardLayout, um JPanels auszutauschen, anstatt sie manuell hinzuzufügen. Wenn Sie sie manuell hinzufügen müssen, stellen Sie sicher, dass der Layout-Manager des empfangenden Containers der Aufgabe gewachsen ist und die Addition gut verarbeitet. Zum Beispiel BorderLayout würde es gut, aber GroupLayout nicht. Wenn Sie manuell hinzufügen oder entfernen, rufen Sie nach diesen Änderungen revalidate(); und repaint() auf dem Container.

Auch Sie verwenden null Layout in Ihrem JPanel hinzugefügt und contentPane, die vollständig ruiniert wird preferredSize Berechnung. Verwenden Sie dieses Layout niemals. Lernen Sie, die Layout-Manager zu verwenden und dann zu verwenden. Das ist dein Hauptfehler.

Für auf diese mehr, lesen Sie bitte: Why is it frowned upon to use a null layout in Swing?

Zum Beispiel:

import java.awt.CardLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 

public class MainGui { 
    public static final String SCHUELER_PANEL = "Schueler Panel"; 
    public static final String EMPTY = "Empty Panel"; 
    private JPanel mainPanel = new JPanel(); 
    private JMenuBar menuBar = new JMenuBar(); 
    private CardLayout cardLayout = new CardLayout(); 
    private SchuelerPanel schuelerPanel = new SchuelerPanel(); 


    public MainGui() { 
     mainPanel.setLayout(cardLayout); 
     mainPanel.add(new JLabel(), EMPTY); // empty label 
     mainPanel.add(schuelerPanel, SCHUELER_PANEL); 

     JMenu menu = new JMenu("Panel"); 
     menu.add(new JMenuItem(new SwapPanelAction(EMPTY))); 
     menu.add(new JMenuItem(new SwapPanelAction(SCHUELER_PANEL))); 
     menuBar.add(menu); 
    } 

    public JPanel getMainPanel() { 
     return mainPanel; 
    } 

    public JMenuBar getMenuBar() { 
     return menuBar; 
    } 

    @SuppressWarnings("serial") 
    private class SwapPanelAction extends AbstractAction { 
     public SwapPanelAction(String title) { 
      super(title); 
      int mnemonic = (int) title.charAt(0); 
      putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      cardLayout.show(mainPanel, (String) getValue(NAME)); 
     } 
    } 

    private static void createAndShowGui() { 
     MainGui mainGui = new MainGui(); 
     JFrame frame = new JFrame("Main Gui"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainGui.getMainPanel()); 
     frame.setJMenuBar(mainGui.getMenuBar()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

und

import java.awt.BorderLayout; 
import java.awt.Font; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.util.HashMap; 
import java.util.Map; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class SchuelerPanel extends JPanel { 
    private static final String TITLE_TEXT = "Lorem Ipsum Dolor Sit Amet"; 
    public static final String[] LABEL_STRINGS = {"Monday", "Tuesday", "Wednesday"}; 
    private Map<String, JTextField> labelFieldMap = new HashMap<>(); 

    public SchuelerPanel() { 
     JLabel titleLabel = new JLabel(TITLE_TEXT, JLabel.CENTER); 
     titleLabel.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 20)); 

     JPanel labelFieldPanel = new JPanel(new GridBagLayout()); 
     for (int i = 0; i < LABEL_STRINGS.length; i++) { 
      addToPanel(labelFieldPanel, LABEL_STRINGS[i], i); 
     } 

     // Don't do what I'm doing here: avoid "magic" numbers! 
     setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     setLayout(new BorderLayout(10, 10)); 
     add(titleLabel, BorderLayout.PAGE_START); 
     add(labelFieldPanel, BorderLayout.CENTER); 
    } 

    // get the text from the JTextField based on the JLabel associated with it 
    public String getText(String labelText) { 
     JTextField textField = labelFieldMap.get(labelText); 
     if (textField == null) { 
      throw new IllegalArgumentException("For labelText: " + labelText); 
     } 
     return textField.getText(); 
    } 

    private void addToPanel(JPanel gblUsingPanel, String labelString, int row) { 
     JLabel label = new JLabel(labelString); 
     label.setFont(label.getFont().deriveFont(Font.BOLD)); 
     JTextField textField = new JTextField(10); 
     labelFieldMap.put(labelString, textField); 

     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = row; 
     gbc.anchor = GridBagConstraints.WEST; 
     gbc.fill = GridBagConstraints.BOTH; 
     gbc.weightx = 0.0; 
     gbc.weighty = 0.0; 
     gbc.insets = new Insets(5, 5, 5, 5); 
     gblUsingPanel.add(label, gbc); 

     gbc.gridx = 1; 
     gbc.anchor = GridBagConstraints.EAST; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gblUsingPanel.add(textField, gbc); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("SchuelerPanel"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new SchuelerPanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+0

Ok ich über die Null-Layout heared auch einige schlechte Dinge. Aber ich habe es nur benutzt, weil es ein einfaches Beispiel ist, aber ich werde es in Zukunft erinnern. Aber ich weiß immer noch nicht, warum mein Frame das Jpanel nicht anzeigt, ich suche den Fehler in meinem Code, hast du eine Idee? Es funktioniert nicht mit Repaint oder Revalidate :( – KungFuKugelfisch

+0

@KungFuKugelfisch: Ich habe Ihnen schon gesagt, warum - Sie verwenden Null-Layouts. Wenn Sie geeignete Layouts verwenden würde, wird das Problem weg. –

+2

@KungFuKugelfisch: Ihre JPanel hat eine bevorzugte Größe von 0,0 wegen der Verwendung von Null-Layouts, und weil Sie Null-Layouts in der contentPane verwenden, wird es nicht einmal die bevorzugte Größe respektieren, sondern die tatsächliche Größe, von denen keine festgelegt wurden Manager Beiß die Kugel und lerne sie –

Verwandte Themen