java - JScrollPane 的底部被切断

标签 java swing user-interface jscrollpane jtextarea

我正在尝试创建一个简单的电子邮件客户端,但正文的底部被切断。如果我添加水平滚动条,它不会出现,垂直滚动条的底部也不会出现。

Image

这是我的代码:

   import java.awt.BorderLayout;
   import java.awt.Container;
   import java.awt.FlowLayout;
   import java.awt.Font;

   import javax.swing.JFrame;
   import javax.swing.JLabel;
   import javax.swing.JPanel;
   import javax.swing.JScrollBar;
   import javax.swing.JScrollPane;
   import javax.swing.JTextArea;
   import javax.swing.JTextField;
   import javax.swing.UIManager;


   @SuppressWarnings("serial")
   public class gui extends JFrame{

gui(String title, int x, int y){

    super(title);
    setSize(x,y);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setResizable(false);

}

public void addElements(){

    Font size30 = new Font(null, Font.PLAIN, 30);

    JPanel pnl = new JPanel();

    Container contentPane = getContentPane();

    //--- User Info ---//

    JPanel userInfo = new JPanel();

    JLabel userLabel = new JLabel("Username: ");
    JTextField userField = new JTextField(12);
    userInfo.add(userLabel);
    userInfo.add(userField);

    JLabel passLabel = new JLabel("Password: ");
    JTextField passField = new JTextField(10);
    userInfo.add(passLabel);
    userInfo.add(passField);

    JLabel serverLabel = new JLabel("Mail Server: ");
    JTextField serverField = new JTextField(10);
    userInfo.add(serverLabel);
    userInfo.add(serverField);

    JLabel portLabel = new JLabel("Server Port: ");
    JTextField portField = new JTextField(3);
    userInfo.add(portLabel);
    userInfo.add(portField);

    //--- To: CC: and Subject Fields ---//

    JPanel msgInfo = new JPanel();

    JLabel toLabel = new JLabel("To: ");
    JTextField toField = new JTextField(30);
    msgInfo.add(toLabel);
    msgInfo.add(toField);

    JLabel subLabel = new JLabel("Subject: ");
    JTextField subField = new JTextField(30);
    msgInfo.add(subLabel);
    msgInfo.add(subField);

    //--- Body ---//

    JPanel bodyPnl = new JPanel(new BorderLayout(10,10));

    JLabel bodyLabel = new JLabel("Body");
    bodyLabel.setFont(size30);

    JTextArea bodyField = new JTextArea(30,70);
    bodyField.setLineWrap(true);
    bodyField.setWrapStyleWord(true);

    JScrollPane bodyScroll = new JScrollPane(bodyField);

    bodyScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
    bodyScroll.setBounds(getX(), getY(), bodyField.getWidth(), bodyField.getHeight());

    bodyPnl.add("South",bodyScroll);

    pnl.add(userInfo);
    pnl.add(msgInfo);
    pnl.add(bodyLabel);
    pnl.add(bodyScroll);

    contentPane.add("North", pnl);

    setVisible(true);

}

}

在我的主类中,我只是创建一个新的 gui,然后调用 addElements() 函数。

最佳答案

FlowLayout 不能很好地“换行”。考虑不同的布局,例如 GridBagLayout...

此外,请停止“尝试”在用户界面上强制指定尺寸,您没有足够的控制力来控制影响尺寸的因素来执行此操作。

相反,依赖布局管理器和 API 功能。例如,不要在框架上调用 setSize,而是调用 pack...我很快就会发布,但我花了这么长时间才找到该调用...我我挠头想知道为什么 UI 不会按照我预期的方式布局......

Form

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class Test 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) {
                }

                Test frame = new Test("Testing", 400, 400);
            }
        });
    }

    Test(String title, int x, int y) {

        super(title);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        addElements();
        pack();
        setVisible(true);
//        setResizable(false);

    }

    public void addElements() {

        Font size30 = new Font(null, Font.PLAIN, 30);

        //--- User Info ---//
        JPanel userInfo = new JPanel(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(2, 2, 4, 2);
        gbc.gridx = 0;
        gbc.gridy = 0;
        JLabel userLabel = new JLabel("Username: ");
        JTextField userField = new JTextField(12);
        userInfo.add(userLabel, gbc);
        gbc.gridx++;
        userInfo.add(userField, gbc);

        JLabel passLabel = new JLabel("Password: ");
        JTextField passField = new JTextField(10);
        gbc.gridx++;
        userInfo.add(passLabel, gbc);
        gbc.gridx++;
        userInfo.add(passField, gbc);

        JLabel serverLabel = new JLabel("Mail Server: ");
        JTextField serverField = new JTextField(10);
        gbc.gridx++;
        userInfo.add(serverLabel, gbc);
        gbc.gridx++;
        userInfo.add(serverField, gbc);

        JLabel portLabel = new JLabel("Server Port: ");
        JTextField portField = new JTextField(3);
        gbc.gridx++;
        userInfo.add(portLabel, gbc);
        gbc.gridx++;
        userInfo.add(portField, gbc);

        gbc = new GridBagConstraints();
        gbc.insets = new Insets(2, 2, 4, 2);
        gbc.gridx = 0;
        gbc.gridy = 0;
        //--- To: CC: and Subject Fields ---//
        JPanel msgInfo = new JPanel(new GridBagLayout());

        JLabel toLabel = new JLabel("To: ");
        JTextField toField = new JTextField(30);
        msgInfo.add(toLabel, gbc);
        gbc.gridx++;
        msgInfo.add(toField, gbc);

        JLabel subLabel = new JLabel("Subject: ");
        JTextField subField = new JTextField(30);
        gbc.gridx++;
        msgInfo.add(subLabel, gbc);
        gbc.gridx++;
        msgInfo.add(subField, gbc);

        //--- Body ---//
//        JPanel bodyPnl = new JPanel(new GridBagLayout());
//        gbc = new GridBagConstraints();
//        gbc.insets = new Insets(2, 2, 4, 2);
//        gbc.gridx = 0;
//        gbc.gridy = 0;

        JLabel bodyLabel = new JLabel("Body");
        bodyLabel.setHorizontalAlignment(JLabel.CENTER);
        bodyLabel.setFont(size30);

        JTextArea bodyField = new JTextArea(30, 70);
        bodyField.setLineWrap(true);
        bodyField.setWrapStyleWord(true);

        JScrollPane bodyScroll = new JScrollPane(bodyField);

        bodyScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
//        bodyScroll.setBounds(getX(), getY(), bodyField.getWidth(), bodyField.getHeight());

        setLayout(new GridBagLayout());
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;

        add(userInfo, gbc);
        gbc.gridy++;
        add(msgInfo, gbc);
        gbc.gridy++;
        gbc.insets = new Insets(10, 10, 4, 10);
        add(bodyLabel, gbc);
        gbc.gridy++;
        gbc.insets = new Insets(4, 10, 10, 10);
        gbc.weighty = 1;
        gbc.fill = GridBagConstraints.BOTH;
        add(bodyScroll, gbc);

    }

}

关于java - JScrollPane 的底部被切断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25256052/

相关文章:

c++ - wxFreeChart 值标签图表

java - Hibernate EntityManager,它应该用作单例吗?

java - JTable 显示 JTextField 搜索结果

java - 如何像 JOptionPane 那样阻塞主线程?

java - JToolBar 拖放插入的行为不符合预期

user-interface - 控制台应用程序 GUI

windows - 找不到适合 Windows 的 git gui。有人知道吗?

java - 请建议java邮件api

java - 非阻塞 PipedStreams?

java - 基于 SWT 的 GUI 在从全尺寸最小化状态最大化时变黑