我有一个JPAnel,Box.createVerticalBox()
布局包含五个JPanel。 (1)标签,(2)表(3)JTextField(4)JTextArea(5)按钮。调整大小:
标签应贴在左上角并保持相同的尺寸,
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可以处理大小调整吗?
答案 0 :(得分:3)
GridBagLayout
是您应用的最佳布局管理器。见https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html
答案 1 :(得分:2)
你可以像Wabbi已经建议的那样使用GridBagLayout。但是,确实有我在评论中提到的限制。
但是,如果您确实希望textarea和table始终具有相同的大小,那么您可以使用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);
现在,随着帧的大小调整,表格和文本区域将会增大/缩小。
boxlayout可以处理大小调整吗?
是的,它可以处理这种类型的调整大小。框布局尊重组件的最大大小。因此,如果您覆盖面板的getMaximumSize()
方法以返回getPreferredSize()
,则面板的高度不会增加。
因此,文本区域和表格的滚动窗格将获得额外的空间。同样,同样的担忧。每个组件最初将根据其首选大小分配空间。
答案 2 :(得分:1)
你应该为gridbagconstraints使用一个变量。这样您就可以执行c.gridy++; c.gridx=0;
和c.gridx++;
稍后插入新组件会更容易。
显式d.gridy=4;
使插入新组件变得困难。