Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用GridBagLayout和GridBagConstraints进行Swing_Java_Swing_Layout_Layout Manager_Gridbaglayout - Fatal编程技术网

Java 使用GridBagLayout和GridBagConstraints进行Swing

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

我正在制作的第一个java GUI应用程序

基本上,我想要实现的目标看起来很简单。 这是一个简单的水平布局,首先包含一个简单的JLabel、一个JTextArea、JButton和至少另一个JLabel

这是我制作的一张简单图片,用于说明:

我只是想澄清一下,我不希望文本区域和底部标签有固定的大小,而是要填充它们所拥有的空间,并且在其他组件之间有一些小的填充

这是迄今为止我编写的代码,如上图所示,它还不是我想要实现的:

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预期布局的简单绘图,如果可以调整大小,则具有更大的宽度和高度。