2016-05-19 14 views
0

Ich habe ein JPanel mit Box.createVerticalBox() Layout mit fünf JPanels. (1) Etikett, (2) eine Tabelle (3) eine JTextField (4) ein JTextArea (5) die Größe buttons.On:Java Größenanpassung einzelner Komponenten von JPanel

Etikett kleben sollten linke Ecke nach oben und die gleichen Größe halten,
JTextField sollte kleben zu der linken Größe zwischen (2) und (4) und auf die volle Breite des Rahmens erweitern
Tasten sollten in der unteren rechten Ecke bleiben und behalten die gleiche Größe,
JTable und JTextArea sollte auf die volle Breite des Rahmens erweitern und gleichmäßig teilen verbleibender Platz

Ich habe mehrere Layouts ausprobiert, konnte aber keine Größenänderung vornehmen. Um dieses Programm zwei Klassen ausgeführt werden EditPanel.java erforderlich:

import java.awt.BorderLayout; 
import java.awt.FlowLayout; 
import javax.swing.Box; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 

public class EditPanel extends JPanel { 
    private JPanel p1Labels; 
    private JPanel p2Table; 
    private JPanel p3ecnTitle; 
    private JPanel p5Buttons;  
    private JTextField fieldK; 
    private JTextField fieldS; 
    private JScrollPane myScrollBar; 
    private Box theBox; 

    public EditPanel() { 
     init(); 
    } 

    public void init() { // Creating a vertical Box layout with five sections, placing jpanels there 

     //First panel with buttons 

     p1Labels = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2)); 
     fieldK = new JTextField("Animal"); 
     fieldS = new JTextField("Fox");   
     p1Labels.add(new JLabel("Kindom: ")); 
     p1Labels.add(fieldK); 
     p1Labels.add(new JLabel("Species: ")); 
     p1Labels.add(fieldS); 

     //Second panel with a table 

     p2Table = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2)); 
     String[] columnNames = {"First", "Second", "Third", "Fourth"}; 
     Object[][] data = {{"11", "12", "13", "Forteen"},{"21", "22", "23", "Twenty four"}}; 
     JTable table = new JTable(data, columnNames); 
     JScrollPane scrollPane1 = new JScrollPane(new JTable(data, columnNames)); 
     table.setFillsViewportHeight(true); 
     p2Table.add(scrollPane1, BorderLayout.CENTER); 

     //Third panel with a JTextField 

     p3ecnTitle = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2)); 
     p3ecnTitle.add(new JLabel("Title: ")); 
     p3ecnTitle.add(new JTextField("", 14)); 

     //Forth panel with JTextArea 
     //p4TextArea = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2));//tried this too 
     JTextArea ecnArea = new JTextArea(10, 20);   
     ecnArea.setText(""); 
     ecnArea.setName("Note"); 
     ecnArea.setLineWrap(true); 
     ecnArea.setWrapStyleWord(true); 
     myScrollBar = new JScrollPane(ecnArea, 
       JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
       JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 

     //Fifth container with buttons 

     p5Buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT, 2, 2)); 
     p5Buttons.add(new JButton("SAVE")); 
     p5Buttons.add(new JButton("DELETE")); 
     p5Buttons.add(new JButton("CANCEL")); 

     //Placing everything in a container 
     theBox = Box.createVerticalBox(); 
     theBox.add(p1Labels); 
     theBox.add(p2Table); 
     theBox.add(p3ecnTitle); 
     //theBox.add(p4TextArea); 
     theBox.add(myScrollBar); 
     theBox.add(Box.createVerticalGlue()); 
     theBox.add(p5Buttons); 
     this.add(theBox); 
    } 
} 

Und die main.java

import javax.swing.JFrame; 
public class Main { 
    public static void main(String[] args) { 
     JFrame myFrame; 
     myPanel EditECNDialog; 
     myFrame = new JFrame();  
     EditECNDialog = new myPanel(); 
     myFrame.setTitle("Notes"); 
     myFrame.add(EditECNDialog); 
     myFrame.pack(); 
     myFrame.setLocationRelativeTo(null); 
     myFrame.setVisible(true); 
    } 
} 

Welche Layout-Griffe die beste Größe ändern? Kann Boxlayout die Größenänderung übernehmen?

Antwort

3

GridBagLayout ist der beste Layout-Manager für Ihre App. Siehe https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

+0

Ich weiß über die Erinnerung, aber wie kann ich das Layout so einstellen, dass es den Raum zwischen zwei Komponenten (JTextArea und JTable) aufteilt? – Stepan

+1

Geben Sie für beide Komponenten den gleichen Wert 0,5 für 'weightx' an. – AhmadWabbi

+2

(1+) Da dies ein vertikales Layout ist, würden Sie die "gewichtigen" Werte für beide Komponenten auf 0,5 setzen. Beachten Sie auch, dass die "gewichtige" nur für "extra" Platz ist, wenn der Rahmen in der Größe geändert wird.Wenn die Tabelle und der Textbereich die gleiche Größe haben sollen, müssen sie dieselbe bevorzugte Höhe haben, da ein GridBagLayout zuerst den Speicherplatz basierend auf der bevorzugten Größe zuweist und dann den gewichtx-Werten den zusätzlichen Speicherplatz zuweist. – camickr

2

Sie können ein GridBagLayout verwenden, wie Wabbi bereits vorgeschlagen hat. Allerdings hat es die Einschränkung, die ich in den Kommentaren notiert habe.

Wenn Sie jedoch möchten, dass Textbereich und Tabelle immer die gleiche Größe haben, können Sie Relative Layout verwenden. Dieses Layout wird zuerst Komponenten mit einer festen Größe Speicherplatz zuweisen. Dann wird verbleibender Platz den Komponenten mit einer relativen Einschränkung zugewiesen.

So würde der Grund Code sein:

RelativeLayout rl = new RelativeLayout(RelativeLayout.Y_AXIS); 
rl.setFill(true); 
JPanel panel = new JPanel(rl); 
panel.add(labelPanel); 
panel.add(tableScrollPane, new Float(1)); 
panel.add(textField); 
panel.add(textAreaScrollPane, new Float(1)); 
panel.add(buttonsPanel); 

Nun ist die Tabelle und Textbereich wachsen/schrumpfen ebenso wie der Rahmen der Größe verändert wird.

Kann Boxlayout die Größenänderung übernehmen?

Ja, es kann mit dieser Art der Größenänderung umgehen. Das Box-Layout berücksichtigt die maximale Größe einer Komponente. Wenn Sie also die Methode Ihrer Panels außer Kraft setzen, um getPreferredSize() zurückzugeben, werden die Panels nicht in der Höhe wachsen.

So wird den Scrollbereichen des Textbereichs und der Tabelle zusätzlicher Speicherplatz zugewiesen. Noch einmal, gleiche Sorge. Jede Komponente wird ursprünglich basierend auf ihrer bevorzugten Größe zugewiesen.

1

Sie sollten eine Variable für gridbagconstraints verwenden. Auf diese Weise können Sie c.gridy++; c.gridx=0; und c.gridx++;
tun Es wird einfacher sein, neue Komponenten später einzufügen. Explizit d.gridy=4; macht das Einfügen neuer Komponenten schwierig.