【问题标题】:How can we add JScrollPane on JTextArea in java?我们如何在 java 中的 JTextArea 上添加 JScrollPane?
【发布时间】:2013-10-13 06:37:30
【问题描述】:

谁能告诉我下面的程序有什么问题?我想将JScrollPane 放在JtextArea 上,但是当我添加它时,JTextArea 不可见。

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

class Area extends JFrame
{
    private JTextArea ta;
    private JTextField tf;
    JScrollPane jp;

    public Area()
    {
       super("Text Area");
       tf=new JTextField();
       tf.setBounds(100,350,300,30);
       add(tf);
       ta=new JTextArea();
       ta.setBounds(100,100,300,200);
       jp= new JScrollPane(ta);
       add(jp);
       setLayout(null);
       setSize(500,500);
       setVisible(true);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }

   public static void main(String...s)
   {
      new Area();
   }
}

【问题讨论】:

  • Don't use a null layout! - Swing 被设计为与布局管理器一起使用,原因太多,无法在此列出。

标签: java swing jscrollpane


【解决方案1】:

我看到了几个问题:

  • 不要使用null 布局;请使用真实的layout

  • JFrame的默认布局是BorderLayout;默认位置是CENTER;一次只能有一个组件占据一个位置;下面的例子使用NORTH & CENTER

  • 最初使用适当的构造函数参数来调整文本组件的大小。

  • 只要滚动窗格小于封闭组件,滚动条就会自动出现;调整框架大小以查看效果。

  • 如图here所示,为了效果,框架的尺寸变小了。

  • 另见Initial Threads

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/** @see https://stackoverflow.com/a/19215436/230513 */
public class Area extends JFrame {

    public Area() {
        super("Text Area");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTextField tf = new JTextField(12);
        add(tf, BorderLayout.NORTH);
        JTextArea ta = new JTextArea(24, 12);
        JScrollPane jp = new JScrollPane(ta);
        add(jp, BorderLayout.CENTER);
        pack();
        // arbitrary size to make vertical scrollbar appear
        setSize(240, 240);
        setLocationByPlatform(true);
        setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Area();
            }
        });
    }
}

【讨论】:

    【解决方案2】:

    试试这个:

    public Area()
    {
       super("Text Area");
       tf=new JTextField();
       tf.setBounds(100,350,300,30);
       add(tf);
       ta=new JTextArea();
       jp= new JScrollPane(ta);
       jp.setBounds(5, 5, 100, 100);
       add(jp);
       setLayout(null);
       setSize(500,500);
       setVisible(true);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    

    你必须在 JScrollPane 上使用 setBounds,而不是在 JTextArea 上

    【讨论】:

    • 哦,非常感谢。我正在搜索这个“你必须在 JScrollPane 上使用 setBounds,而不是在 JTextArea 上”解决了我的问题。
    【解决方案3】:

    听起来像是添加的,但由于政策原因未显示,试试这个:

      jp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
      jp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    

    【讨论】:

    • 这行不通。他必须在jp 上使用setBounds 方法,而不是在JTextArea 上,因为当他将textArea 添加到scrollPane 时,scrollPane 是父级
    • @SylwekDerkacz 实际上我运行他的代码并且那里没有文本区域。因为 setLayoutO(null),老实说我从来没有使用过 setBounds,因为我不同意 setBounds。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    相关资源
    最近更新 更多