JScrollPane的底部被切断了 [英] Bottom of JScrollPane is cut off

查看:129
本文介绍了JScrollPane的底部被切断了的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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




$ b $

  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();

容器contentPane = getContentPane();

// ---用户信息--- //

JPanel userInfo = new JPanel();

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

JLabel passLabel = new JLabel(密码:);
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(服务器端口:);
JTextField portField = new JTextField(3);
userInfo.add(portLabel);
userInfo.add(portField);

// --- To:CC:和主题字段--- //

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);

}

}

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

解决方案

FlowLayout 没有好好换行。考虑一个不同的布局, GridBagLayout 例如......



此外,停止尝试强制大小到你的用户界面,你没有足够的控制权来影响调整大小。



相反,要依赖布局管理器和API功能。例如,不要在你的框架上调用 setSize ,而是调用 pack ...我很快就会发布,但它我花了这么长时间才找到那个电话......我在摸不着头脑,想知道为什么用户界面不按我预期的方式布局......



  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;

公共类测试扩展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){
}

测试帧=新测试(测试,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);

// ---用户信息--- //
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(密码:);
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(服务器端口:);
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:和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.setHorizo​​ntalAlignment(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);

}

}


I am trying to create a simple email client and the bottom of the body is being cut-off. If I add a horizontal scroll bar, it does not appear, and the bottom of the Vertical scroll bar does not appear either.

Here is my code:

   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);

}

}

In my main class I am just creating a new gui and then calling the addElements() function.

解决方案

FlowLayout doesn't "wrap" well. Consider a different layout, GridBagLayout for example...

Also, stop "trying" to force a size onto your UI, you don't have enough control over the factors which affect sizing to do this.

Instead, rely on the layout managers and API functionality. For example, instead of calling setSize on your frame, call pack...I would have posted soon, but it took me this long to find that call...I was scratching my head wondering why the UI wouldn't layout the way I expected...

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);

    }

}

这篇关于JScrollPane的底部被切断了的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆