2016-08-03 12 views
0

Ich habe ein sehr spezifisches Layout im Sinn, das ich seit einiger Zeit ohne Erfolg zu erreichen versuche. Das Layout, das ich erstellen möchte, besteht darin, ein einzelnes JPanel mit einer festen Höhe in der vertikalen Mitte des anderen Panels zu platzieren. Horizontal sollte es sich strecken, um den Grenzen des anderen zu entsprechen.Wie würde ich dieses Layout in Java Swing machen?

Auch hier sind die Anforderungen für sie sein:

  1. Zwei JPanels, eine innerhalb der anderen
  2. platziert
  3. der Innenplatte sollte eine statische Höhe haben
  4. dem Innenpaneel sollte vertikal
  5. zentriert
  6. Die innere Verkleidung sollte sich horizontal dehnen, um die Seiten der äußeren Verkleidung zu treffen.

Hier finden Sie ein Bild von einem Beispiel dafür: enter image description here

Pro Anfragen mehrere Leute für mich, meinen Code zu schreiben, die nicht funktioniert:

JPanel MainPanel = new JPanel(); 
frmPhoneClicker.getContentPane().add(MainPanel); 
MainPanel.setLayout(new MigLayout("", "[984px]", "[165px]")); 


Panel subPanel = new JPanel(); 
subPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5)); 
MainPanel.add(subPanel, "cell 0 0 1 1,growx,aligny center"); 
+0

Versuchen Sie einen Layout-Manager eines Drittanbieters wie MigLayout. Das sollte alles bieten, was Sie brauchen. Wenn Sie einen integrierten Layout-Manager verwenden möchten, können Sie [BoxLayout] (https://docs.oracle.com/javase/tutorial/uiswing/layout/box.html) verwenden. – Thomas

+0

@Thomas Ich habe versucht, aber ich konnte nicht herausfinden, wie man die eine Zelle, ich habe es zu arbeiten, in den gesamten Raum der äußeren Platte zu machen. – ManOfPanda

+0

Das sollte nicht zu schwer sein, nur die innere Platte wachsen lassen, aber nicht vertikal. Stellen Sie keine maximale Breite usw. ein. Wenn dies nicht funktioniert, können Sie Code anzeigen. – Thomas

Antwort

3

Sie auf jeden Fall müssen erfahren Sie mehr über Layouts in Ihrem Fall GridBagLayout wäre hilfreich. Aber hier geht es:

// your Panels 
JPanel mainPanel = new JPanel(); 
JPanel subPanel = new JPanel(); 
mainPanel.setLayout(new GridBagLayout()); // use GridBagLayout with mainPanel 
subPanel.setPreferredSize(new Dimension (0,165)); // use a preferred height for the subPanel 
GridBagConstraints c = new GridBagConstraints(); // your gridBagLayout Constraints 
c.fill = GridBagConstraints.HORIZONTAL; // stretch subPanel horizontal 
c.weightx = 1.0; // with 100% of screen 
mainPanel.add(subPanel,c); // add sub to mainPanel with the constraints 
+0

ArcticLord, Vielen Dank für Ihre sehr hilfreiche Antwort. Ich stimme zu, ich muss mehr über Layouts lernen. Während ich Java nicht neu bin, bin ich meistens neu in Swing. Ich schätze die Hilfe. – ManOfPanda

2

Ein komplettes Arbeits Beispiel mit Farben Ihr Schema folgen:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Toolkit; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class testPanel extends JFrame{ 

    public testPanel() { 
     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     int screenHeight = screenSize.height; 
     int screenWidth = screenSize.width; 
     this.setSize(screenWidth/2, screenHeight * 2/3); 

     this.setLocationRelativeTo(null); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     this.setResizable(true); 
     this.setAlwaysOnTop(false); 
     this.setUndecorated(false); 

     JPanel outerPanel = new JPanel(new GridBagLayout()); 
     outerPanel.setBorder(BorderFactory.createLineBorder(Color.RED)); 
     JPanel innerPanel = new JPanel(); 
     innerPanel.setBorder(BorderFactory.createLineBorder(Color.BLUE)); 
     innerPanel.setPreferredSize(new Dimension (0,300)); 

     GridBagConstraints c = new GridBagConstraints(); 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.weightx = 1;//Size 
     outerPanel.add(innerPanel, c); 

     this.add(outerPanel); 
     this.setVisible(true); 
    } 

} 

Bitte beachten Sie, dass, wenn die haltige Fenstergröße unterschreitet der Größe des innerPanel, dann ist die feste Höhe wird nicht mehr gelten.