2017-02-11 1 views
0

Ich versuche, zwei JPanels zu einem Jframe hinzuzufügen, aber es sieht so aus, als ob sie wie eins aussehen. Ich versuche, sie wie dieses Bild übereinander zu stapeln.zwei JPanels zu JFrame hinzufügen

layout image

ich denke ich an Layout-Manager aussehen müssen können? Ich brauche nur ein wenig Anstupsen in die richtige Richtung.

package projectTwo; 

import javax.swing.*; 

public class checkFrame 
{ 
    public static void main (String[] args) 
    { 
     JFrame frame = new JFrame("Compose Message"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     checkPanel bob = new checkPanel(); 
     //frame.add(bob); 
     frame.getContentPane().add(bob); 
     frame.setResizable(false); 
     frame.setSize(750, 500); 
     frame.setVisible(true); 
    } 

} 

package projectTwo; 

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 


public class checkPanel extends JPanel implements ActionListener 
{ 
    private JPanel entry, display; 
    private JLabel name, checkAmount, payOrderOf, numPrint, numWords; 
    private JTextField nameT, checkAmountT; 
    private JButton Submit; 

    public checkPanel() 
    { 
     entryComponents(); 
     checkDisplay(); 
    } 
    private void entryComponents(){ 

    name = new JLabel("Name:"); 
    checkAmount = new JLabel("Check Amount:"); 


    nameT = new JTextField(20); 
    nameT.addActionListener(this); 

    checkAmountT = new JTextField(20); 
    checkAmountT.addActionListener(this); 

    Submit = new JButton("Submit"); 
    Submit.addActionListener(this); 


    add(name); 
    add(nameT); 
    add(checkAmount); 
    add(checkAmountT); 
    add(Submit); 

    setPreferredSize(new Dimension(750, 75)); 
    setBackground(new Color(200,200,200)); 
} 

private void checkDisplay(){ 
    payOrderOf = new JLabel("Pay to the Order of: "); 


    add(payOrderOf); 

    setBackground(new Color(220,255,225)); 
} 

public void actionPerformed (ActionEvent event) 
    { 

    } 
} 
+1

"* Ich brauche nur ein wenig Anstupsen in die richtige Richtung. *" Ein guter Anfang: https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html – user1803551

Antwort

0

Sie auf jeden Fall einen Blick auf Layout-Manager übernehmen sollte. Im Moment fügen Sie JPanels einfach hinzu, ohne Angaben darüber zu machen, wo sie sein sollten.

Sie haben in diesem Fall ein paar Optionen. Sie könnten eine GridLayout verwenden, aber das führt dazu, dass alle Panels die gleiche Größe haben. Wenn Sie nur zwei Panels unter einander haben möchten, würde ich vorschlagen, eine BorderLayout zu verwenden. Ich habe Ihren Code wie folgt angepasst:

public class checkPanel extends JPanel implements ActionListener 
{ 
private JPanel entry, display; 
private JLabel name, checkAmount, payOrderOf, numPrint, numWords; 
private JTextField nameT, checkAmountT; 
private JButton Submit; 

public checkPanel() 
{ 
    this.setPreferredSize(new Dimension(750, 75)); 
    entryComponents(); 
    checkDisplay(); 

    this.setLayout(new BorderLayout()); 
    this.add(entry, BorderLayout.NORTH); 
    this.add(display, BorderLayout.CENTER); 
} 
private void entryComponents(){ 

    entry = new JPanel(); 
    // You should specify entry's layout as well FlowLayout are used by default 

    name = new JLabel("Name:"); 
    checkAmount = new JLabel("Check Amount:"); 


    nameT = new JTextField(20); 
    nameT.addActionListener(this); 

    checkAmountT = new JTextField(20); 
    checkAmountT.addActionListener(this); 

    Submit = new JButton("Submit"); 
    Submit.addActionListener(this); 


    entry.add(name); 
    entry.add(nameT); 
    entry.add(checkAmount); 
    entry.add(checkAmountT); 
    entry.add(Submit); 


    entry.setBackground(new Color(200,200,200)); 
} 

private void checkDisplay(){ 

    display = new JPanel(); 
    // You should specify display's layout as well FlowLayout are used by  default 

    payOrderOf = new JLabel("Pay to the Order of: "); 


    display.add(payOrderOf); 

    display.setBackground(new Color(220,255,225)); 
} 
@Override 
public void actionPerformed(ActionEvent arg0) { 
    // TODO Auto-generated method stub 

} 

} 

Es ist im Allgemeinen eine gute Idee, ein Layout zu jedem JPanel zuweisen Sie erstellen. Die Wahl des Layouts hängt davon ab, wie das Panel funktionieren soll.

+0

// Sie sollten das Layout des Eintrags angeben, und FlowLayout wird standardmäßig verwendet. Also sollte mein Code wie dieses Beispiel aussehen? JPanel p = neues JPanel (neues BorderLayout()); –

+0

@JamesParker ja du solltest. In jedem JPanel sollte ein Layout definiert sein, das angibt, wie Elemente innerhalb des Panels positioniert sind. Und dann Elemente, die mit der ausgewählten Layout-Spezifikation zu diesem Panel hinzugefügt wurden. Zum Beispiel für ein BorderLayout muss die Position jedes Elements angegeben werden, zB panel.add (new JLabel ('' "), BorderLayout.CENTER) während in einem GridLayout die Reihenfolge vorgegeben ist und Sie einfach Elemente hinzufügen können zB panel.add (label1) und panel.add (label2). Hoffe, das hilft. – TM00

+0

Ich habe die private void entryComponents() mit JPanel entry = new JPanel (new BorderLayout()), und ändern Sie die add s wie dieses entry.add (name, BorderLayout .CENTER); Was muss ich in meinem Konstruktor tun, um diese zu laden? –

0

Gridbag Layout verwenden, können Sie viel helfen, wie ich auch einen Separator zwischen den Platten setzen würde

+0

Vielen Dank für Ihre Ich werde dies im Hinterkopf behalten. Wir werden hier bald Layout lernen. –

Verwandte Themen