简体   繁体   English

jtextarea不会用GridBagConstraints填充面板

[英]jtextarea wont fill panel with GridBagConstraints

From my code I expect my JTextArea to fill the top left border seen below: 从我的代码中,我希望我的JTextArea填充如下所示的左上方边框: 在此处输入图片说明

But as you can see its taking up a tiny section in the middle. 但是正如您所看到的,它占据了中间的一小部分。 I am using GridBagConstraints on the panel which contains the components. 我在包含组件的面板上使用GridBagConstraints。

There is a main class which calles up a class called frame. 有一个主类,它调用一个称为框架的类。 This class creates the JFrame and sets the size as well as other things. 此类创建JFrame并设置大小以及其他内容。 This is then called from the MainFrame.java which has extended the jframe which creates 3 panels and sets their layout. 然后从MainFrame.java中调用它,该扩展了jframe,它创建了3个面板并设置了它们的布局。 this is seen below 如下所示

import javax.swing.*;
import java.awt.*;

public class MainFrame extends JFrame
{
    private Panel1 storyPanel;
    private Panel2 statsPanel;
    private Panel3 commandsPanel;

    public MainFrame(String title)
    {
        super(title);

        // Setting Layout
        GridBagConstraints gbc = new GridBagConstraints();

        storyPanel = new Panel1();
        storyPanel.setLayout(new GridBagLayout());
        statsPanel = new Panel2();
        commandsPanel = new Panel3();

        Container p = getContentPane();

        p.add(storyPanel, BorderLayout.WEST);
        p.add(statsPanel, BorderLayout.EAST);
        p.add(commandsPanel, BorderLayout.SOUTH);

    }
}

The panel in questions is Panel1 or storyPanel. 有问题的面板是Panel1或storyPanel。 I have set the layout and the code calls the Panel1.java as seen below: 我已经设置好布局,代码调用了Panel1.java,如下所示:

import javax.swing.*;
import java.awt.*;

public class Panel1 extends JPanel
{
    public Panel1()
    {
        GridBagConstraints gbc = new GridBagConstraints();

        //Set size of Panel1
        int xsizeP1 = (Frame.xsize() / 2);
        int ysizeP1 = (Frame.ysize() / 3 * 2);
        setPreferredSize(new Dimension(xsizeP1, ysizeP1));
        setBorder(BorderFactory.createLineBorder(Color.black));

        //Adding JTextArea and adding settings to it
        JTextArea storyLine = new JTextArea("       test        ");
        storyLine.setLineWrap(true);
        storyLine.setWrapStyleWord(true);
        storyLine.setEditable(false);


        //Adding JScrollPane to the JTextArea and making it have a vertical scrollbar
        JScrollPane scroll = new JScrollPane(storyLine);
        scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        //GridBagConstraints setup for components
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.fill = GridBagConstraints.VERTICAL;
        add(scroll, gbc);
    }
}

I don't understand why my gbc.fill isnt making the JTextArea fill the top left border of the screen shot. 我不明白为什么我的gbc.fill无法使JTextArea填充屏幕截图的左上边框。

Thanks in advance for any reply's 预先感谢您的任何答复

-Tom T 汤姆·T


changing the layout to border layout 将布局更改为边框布局

import javax.swing.*;
import java.awt.*;

public class Panel1 extends JPanel
{
    public Panel1()
    {
        //GridBagConstraints gbc = new GridBagConstraints();
        //gbc.weightx = 0.1;
        //gbc.weighty = 0.1;
        BorderLayout b = new BorderLayout();

        //Set size of Panel1
        int xsizeP1 = (Frame.xsize() / 2);
        int ysizeP1 = (Frame.ysize() / 3 * 2);
        setPreferredSize(new Dimension(xsizeP1, ysizeP1));
        setBorder(BorderFactory.createLineBorder(Color.black));

        //Adding JTextArea and adding settings to it
        JTextArea storyLine = new JTextArea("       test        ");
        storyLine.setLineWrap(true);
        storyLine.setWrapStyleWord(true);
        storyLine.setEditable(false);


        //Adding JScrollPane to the JTextArea and making it have a vertical scrollbar
        JScrollPane scroll = new JScrollPane(storyLine);
        scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

    //gbc.gridx = 0;
    //gbc.gridy = 0;
        //gbc.weightx = 1;
        //gbc.weighty = 1;
        //gbc.fill = GridBagConstraints.BOTH;
        add(scroll, b.CENTER);
    }
}
  1. Don't set the layout of storyPanel , as it's contents have already been added and laid out, so changing the layout manager here will discard any properties you applied. 不要设置storyPanel的布局,因为它的内容已经添加并布局,因此在此处更改布局管理器将丢弃您应用的所有属性。 Instead, set the layout in Panel1 's constructor before you add any components. 相反,在添加任何组件之前,请在Panel1的构造函数中设置布局。
  2. Use GridBagConstraints.BOTH for the fill property. 使用GridBagConstraints.BOTH作为fill属性。 The fill property can only have one specified value fill属性只能有一个指定值
  3. Use weightx and weighty to specify how much of the available space the component should use 使用weightxweighty指定组件应使用多少可用空间

For example... 例如...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class MainFrame extends JFrame {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new MainFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    private Panel1 storyPanel;
//  private Panel2 statsPanel;
//  private Panel3 commandsPanel;

    public MainFrame(String title) {
        super(title);

        storyPanel = new Panel1();

        Container p = getContentPane();

        p.add(storyPanel, BorderLayout.WEST);
        p.add(new JLabel("East"), BorderLayout.EAST);
        p.add(new JLabel("South"), BorderLayout.SOUTH);

    }

    public class Panel1 extends JPanel {

        public Panel1() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();

            //Set size of Panel1
            setBorder(BorderFactory.createLineBorder(Color.black));

            //Adding JTextArea and adding settings to it
            JTextArea storyLine = new JTextArea(20, 20);
            storyLine.setLineWrap(true);
            storyLine.setWrapStyleWord(true);
            storyLine.setEditable(false);

            //Adding JScrollPane to the JTextArea and making it have a vertical scrollbar
            JScrollPane scroll = new JScrollPane(storyLine);
            scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
            scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

            //GridBagConstraints setup for components
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.fill = GridBagConstraints.BOTH;
            gbc.weightx = 1;
            gbc.weighty = 1;
            add(scroll, gbc);
        }
    }
}

Having said all that, a BorderLayout would be simpler 说了这么多, BorderLayout会更简单

public class Panel1 extends JPanel {

    public Panel1() {
        setLayout(new BorderLayout());

        //Set size of Panel1
        setBorder(BorderFactory.createLineBorder(Color.black));

        //Adding JTextArea and adding settings to it
        JTextArea storyLine = new JTextArea(20, 20);
        storyLine.setLineWrap(true);
        storyLine.setWrapStyleWord(true);
        storyLine.setEditable(false);

        //Adding JScrollPane to the JTextArea and making it have a vertical scrollbar
        JScrollPane scroll = new JScrollPane(storyLine);
        scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        add(scroll);
    }
}

i tried a border layout and set it to center expecting it to resize but that failed as well 我尝试了边框布局,并将其设置为居中,期望它会调整大小,但同样失败

Would suggest that you're making a fundamental mistake some where, as it works fine for me. 建议您在某个地方犯一个基本错误,因为这对我来说很好。 Remember, set the layout BEFORE you add any components to the container 请记住,在将任何组件添加到容器之前,请设置布局

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM