2016-05-19 2 views
0

У меня есть JPanel с Box.createVerticalBox() макет, содержащий пять JPanels. (1) Этикетки, (2) таблицу (3) JTextField (4) JTextArea (5) buttons.On размер:Изменение размера отдельных компонентов JPanel

этикетки должны придерживаться левого верхнего угла и сохранить тот же размер,
JTextField должны придерживаться (2) и (4) и развернуть до полной ширины рамки
Кнопки должны придерживаться нижнего правого угла и сохранять одинаковый размер,
JTable и JTextArea должны расширяться до полной ширины кадра и одинаково делиться оставшееся место

Я пробовал несколько макетов, но не мог изменить размер. Для запуска этой программы два класса необходимы EditPanel.java:

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); 
    } 
} 

И в 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); 
    } 
} 

Какие Компоновка ручки изменения размера лучше всего? Может ли boxlayout обрабатывать размер?

ответ

3

GridBagLayout - лучший менеджер макетов для вашего приложения. См. https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

+0

Я знаю о НАПОМИНАНИИ, но как установить макет так, чтобы он разбивал пространство между двумя компонентами (JTextArea и JTable)? – Stepan

+1

Дайте то же значение 0.5 для 'weightx' для обоих компонентов. – AhmadWabbi

+2

(1+) Поскольку это вертикальная компоновка, вы должны сделать «весомые» значения 0.5 для обоих компонентов. Также имейте в виду, что «весомый» используется только для «лишнего» пространства по мере изменения размера кадра.То есть, если вы хотите, чтобы таблица и область текста были одного размера, тогда они также должны иметь ту же самую предпочтительную высоту, поскольку GridBagLayout сначала выделяет пространство на основе предпочтительного размера, а затем выделяет дополнительное пространство для значений weightx. – camickr

2

Вы можете использовать GridBagLayout, как уже предложил Wabbi. Однако есть ли ограничение, которое я заметил в комментариях.

Однако, если вы действительно хотите, чтобы textarea и таблица всегда были одного размера, вы можете использовать Relative Layout. Этот макет сначала выделит пространство для компонентов с фиксированным размером. Затем любое оставшееся пространство выделяется компонентам с относительным ограничением.

Так основной код будет:

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); 

Теперь таблица и текстовая область будет расти/сокращаться в равной мере как кадр изменяется.

Может ли коробка с ручкой изменить размер?

Да, он может обрабатывать этот тип изменения размера. Конструкция коробки соответствует максимальному размеру компонента. Поэтому, если вы переопределяете метод ваших панелей , чтобы вернуть getPreferredSize(), тогда панели не будут расти в высоту.

Таким образом, дополнительное пространство будет предоставлено прокруткам текстовой области и таблицы. Опять же, такая же озабоченность. Первоначально каждому компоненту будет выделено пространство на основе его предпочтительного размера.

1

Вы должны использовать одну переменную для ограничений gridbag. Таким образом, вы можете сделать c.gridy++; c.gridx=0; и c.gridx++;
В дальнейшем будет легче вставлять новые компоненты. Явный d.gridy=4; затрудняет вставку новых компонентов.

Смежные вопросы