Java 使用GridBagLayout和GridBagConstraints进行Swing
我正在制作的第一个java GUI应用程序 基本上,我想要实现的目标看起来很简单。 这是一个简单的水平布局,首先包含一个简单的JLabel、一个JTextArea、JButton和至少另一个JLabel 这是我制作的一张简单图片,用于说明: 我只是想澄清一下,我不希望文本区域和底部标签有固定的大小,而是要填充它们所拥有的空间,并且在其他组件之间有一些小的填充 这是迄今为止我编写的代码,如上图所示,它还不是我想要实现的:Java 使用GridBagLayout和GridBagConstraints进行Swing,java,swing,layout,layout-manager,gridbaglayout,Java,Swing,Layout,Layout Manager,Gridbaglayout,我正在制作的第一个java GUI应用程序 基本上,我想要实现的目标看起来很简单。 这是一个简单的水平布局,首先包含一个简单的JLabel、一个JTextArea、JButton和至少另一个JLabel 这是我制作的一张简单图片,用于说明: 我只是想澄清一下,我不希望文本区域和底部标签有固定的大小,而是要填充它们所拥有的空间,并且在其他组件之间有一些小的填充 这是迄今为止我编写的代码,如上图所示,它还不是我想要实现的: public class QueryPanel extends JPane
public class QueryPanel extends JPanel{
private JLabel headerLabel;
private String defaultString = "Insert query here...";
private boolean isTextFieldClicked = false;
private JTextArea queryTextArea;
private JScrollPane queryScrollPane;
private JButton executeQueryButton;
private JTextArea resultTextArea;
private JScrollPane resultScrollPane;
public QueryPanel(String headerText){
GridBagLayout gridLayout = new GridBagLayout();
setLayout(gridLayout);
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.HORIZONTAL;
headerLabel = new JLabel();
headerLabel.setText(headerText);
constraints.gridy = 0;
add(headerLabel, constraints);
queryTextArea = new JTextArea(defaultString);
queryScrollPane = new JScrollPane(queryTextArea);
constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.weighty = 1.0;
constraints.weightx = 1.0;
constraints.gridy = 1;
add(queryScrollPane, constraints);
executeQueryButton = new JButton("Execute Query");
constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.gridy = 2;
add(executeQueryButton, constraints);
resultTextArea = new JTextArea();
resultTextArea.setEditable(false);
resultScrollPane = new JScrollPane(resultTextArea);
constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.weighty = 1.0;
constraints.weightx = 1.0;
constraints.gridy = 3;
add(resultScrollPane, constraints);
}
}
关于底部组件,想知道是否最好将静态结果显示为大标签,而不是不可编辑的文本区域。。。找不到哪个更“正确”的做法。在上面粘贴为问题(IMHO)的代码中,有两件事我觉得是错的
weightx/weighty
都有值1.0
,而它应该是
由于假定每个组件
在父容器上获取不同的长度gbc.fill
设置为水平
,这意味着在调整
父级,组件将仅在水平方向上调整大小。
对我来说,如果组件将在
两个方向,而不是一个方向,以获得良好的视觉外观import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GridBagLayoutExample {
private static final int GAP = 5;
private GridBagConstraints gbc;
private JTextArea insertQueryTextArea;
private JTextArea resultTextArea;
private JScrollPane scroller;
private JButton executeQueryButton;
public GridBagLayoutExample () {
gbc = new GridBagConstraints ();
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.insets = new Insets ( GAP, GAP, GAP, GAP );
gbc.fill = GridBagConstraints.BOTH;
}
private void displayGUI () {
JFrame frame = new JFrame ( "" );
frame.setDefaultCloseOperation ( JFrame.DISPOSE_ON_CLOSE );
JPanel contentPane = getPanel ();
contentPane.setLayout ( new BorderLayout ( GAP, GAP) );
JPanel containerPanel = getPanel ();
containerPanel.setLayout ( new GridBagLayout () );
addComponent ( 0, 0, 1, 1, 1.0, 0.1, containerPanel,
new JLabel ( "Please inesrt your DML query here: ", JLabel.CENTER ) );
insertQueryTextArea = getTextArea ();
scroller = new JScrollPane ();
scroller.setViewportView ( insertQueryTextArea );
addComponent ( 0, 1, 1, 1, 1.0, 0.4, containerPanel, scroller );
JPanel buttonPanel = getPanel ();
executeQueryButton = new JButton ( "Execute Query" );
buttonPanel.add ( executeQueryButton );
addComponent ( 0, 2, 1, 1, 1.0, 0.1, containerPanel, buttonPanel );
resultTextArea = getTextArea ();
scroller = new JScrollPane ();
scroller.setViewportView ( resultTextArea );
addComponent ( 0, 3, 1, 1, 1.0, 0.4, containerPanel, scroller );
contentPane.add ( containerPanel, BorderLayout.CENTER );
frame.setContentPane ( contentPane );
frame.pack ();
frame.setLocationByPlatform ( true );
frame.setVisible ( true );
}
private void addComponent ( int gridx, int gridy,
int gridwidth, int gridheight,
double weightx, double weighty,
JComponent container, JComponent component ) {
gbc.gridx = gridx;
gbc.gridy = gridy;
gbc.gridwidth = gridwidth;
gbc.gridheight = gridheight;
gbc.weightx = weightx;
gbc.weighty = weighty;
container.add ( component, gbc );
}
private JTextArea getTextArea () {
JTextArea tArea = new JTextArea ( 10, 10 );
tArea.setLineWrap ( true );
tArea.setWrapStyleWord ( true );
return tArea;
}
private JPanel getPanel () {
JPanel panel = new JPanel ();
panel.setOpaque ( true );
panel.setBorder ( BorderFactory.createEmptyBorder ( GAP, GAP, GAP, GAP ) );
return panel;
}
public static void main ( String [] args ) {
Runnable runnable = new Runnable () {
@Override
public void run () {
new GridBagLayoutExample ().displayGUI ();
}
};
EventQueue.invokeLater ( runnable );
}
}
关于底部组件,想知道是否最好将静态结果显示为大标签,而不是不可编辑的文本区域。。。找不到哪个更适合做。
如果滚动JTextArea
的内容是实际设计背后的想法,那么显示结果的JTextArea
肯定是合适的解决方案
以下是输出:
resultTextArea=newjtextarea()代码>可以通过设置预期文本的列号和行号来建议首选大小。这可以在构造函数中完成。一般提示:1)为了更快地获得更好的帮助,请发布一个或。2) 提供最小尺寸的ASCII艺术或GUI预期布局的简单绘图,如果可以调整大小,则具有更大的宽度和高度。