JScrollPane未添加到JTextArea [英] JScrollPane is not added to JTextArea

查看:114
本文介绍了JScrollPane未添加到JTextArea的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我看到了一些像这个问题的问题,但我无法解决这个问题。我无法在 JTextArea 上看到 JScrollPane 。任何人都可以指出我在哪里犯了我的错误?谢谢。

I saw a few questions like this question, but I couldn't get this solved. I cannot get a JScrollPane visible on JTextArea. Can anyone please point out where I have done my mistake? Thanks.

package experiement;

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Experiment extends JFrame{

   public Experiment(){
   JTextArea tarea=new JTextArea();
   tarea.setBounds(100,100,200,200);
   JScrollPane pan= new JScrollPane();
   pan.setPreferredSize(new Dimension(100,100));
   pan=new      JScrollPane(tarea,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

   add(pan);
   add(tarea);

    setLayout(null);
    setSize(600,600);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}

public static void main(String[]aegs){
    Experiment e=new Experiment();
}
}


推荐答案

问题使用您的代码:


  • 您可以通过设置其边界来约束JTextArea的大小。无论何时使用setBounds,setSize或setPreferredSize,都会使JTextArea的大小刚性,因此如果向其添加大于此大小的文本,则不会展开。这样做通常会导致包含JScrollPane在需要时显示滚动条,因为JTextArea在需要时不会展开。

  • 您使用的是null布局。虽然null布局和 setBounds()似乎可以像创建复杂GUI的最简单和最好的方式一样使用Swing GUI,但是你创建的Swing GUI越多,就会遇到更严重的困难。使用它们时当GUI调整大小时,它们不会调整组件的大小,它们是增强或维护的皇室女巫,当它们被放置在滚动窗格中时它们完全失败,当它们在所有平台上观看时或者与原始平台不同的屏幕分辨率时它们看起来很糟糕。

  • 您正在将JTextArea添加到两个容器,即GUI和JScrollPane,这在Swing GUI中是不允许的。

  • You constrain the size of your JTextArea by setting its bounds. Whenever you do this, either with setBounds, setSize, or setPreferredSize, you make the JTextArea's size rigid and so it won't expand if text is added to it that is larger than this size. Doing this will usually result in the containing JScrollPane from showing scrollbars when needed since the JTextArea won't expand when needed.
  • You're using null layouts. While null layouts and setBounds() might seem to Swing newbies like the easiest and best way to create complex GUI's, the more Swing GUI'S you create the more serious difficulties you will run into when using them. They won't resize your components when the GUI resizes, they are a royal witch to enhance or maintain, they fail completely when placed in scrollpanes, they look gawd-awful when viewed on all platforms or screen resolutions that are different from the original one.
  • You're adding the JTextArea to two containers, the GUI and the JScrollPane, and this is not allowed in Swing GUI's.

相反:


  • 通过设置约束JTextArea的已查看大小它的行和列属性,通过将它们传递到JTextArea的两个int构造函数中最容易实现。

  • 使用嵌套的JPanels,每个都有自己的布局,以实现复杂,灵活和有吸引力的GUI。

  • 仅将JTextArea添加到JScrollPane的视口,然后将JScrollPane添加到GUI。

  • Constrain the viewed size of the JTextArea by setting its rows and columns properties, something easiest to achieve by passing these into the JTextArea's two int constructor.
  • Use nested JPanels, each with its own layout to achieve complex, yet flexible and attractive GUI's.
  • Add your JTextArea to the JScrollPane's viewport only, and then the JScrollPane to the GUI.

例如,假设您希望在G中心的JScrollPane内部使用JTextArea UI,顶部有按钮,下面有一个JTextField和一个提交按钮,比如一个典型的聊天窗口类型应用程序,你可以将整个布局设为BorderLayout,添加一个GridLayout-使用带有按钮的JPanel到顶部,一个BoxLayout使用JPanel和JTextField和提交按钮到底部,JScrollPane将JTextArea保存到中心。它可能如下所示:

For example say you wanted a JTextArea inside of a JScrollPane within the center of your GUI, with buttons on top and a JTextField and a submit button below, say a typical chat window type application, you could make the overall layout a BorderLayout, add a GridLayout-using JPanel with buttons to the top, a BoxLayout using JPanel with the JTextField and submit button to the bottom, and the JScrollPane holding the JTextArea to the center. It could look like this:

和代码可能如下所示:

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

@SuppressWarnings("serial")
public class Experiment2 extends JPanel {
    private static final int ROWS = 20;
    private static final int COLUMNS = 50;
    private static final int GAP = 3;
    // create the JTextArea, setting its rows and columns properties
    private JTextArea tarea = new JTextArea(ROWS, COLUMNS);
    private JTextField textField = new JTextField(COLUMNS);

    public Experiment2() {
        // create the JScrollPane and pass in the JTextArea
        JScrollPane scrollPane = new JScrollPane(tarea);

        // let's create another JPanel to hold some buttons
        JPanel buttonPanel = new JPanel(new GridLayout(1, 0, GAP, 0));
        buttonPanel.add(new JButton("Save"));
        buttonPanel.add(new JButton("Load"));
        buttonPanel.add(new JButton("Whatever"));
        buttonPanel.add(new JButton("Exit"));

        // create JPanel for the bottom with JTextField and a button
        JPanel bottomPanel = new JPanel();
        bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.LINE_AXIS));
        bottomPanel.add(textField);
        bottomPanel.add(Box.createHorizontalStrut(GAP));
        bottomPanel.add(new JButton("Submit"));

        setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        // use BorderLayout to add all together
        setLayout(new BorderLayout(GAP, GAP));
        add(scrollPane, BorderLayout.CENTER);  // add scroll pane to the center
        add(buttonPanel, BorderLayout.PAGE_START);  // and the button panel to the top
        add(bottomPanel, BorderLayout.PAGE_END);
    }

    private static void createAndShowGui() {
        Experiment2 mainPanel = new Experiment2();

        JFrame frame = new JFrame("Experiment 2");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}









编辑



让我们试验并创建一个包含两个JTextAreas的GUI,一个是由colRowTextArea变量设置和保存columns和rows属性的GUI,另一个是设置JTextArea的首选大小的GUI,并将其变量调用为prefSizeTextArea。



EDIT

Rather than guess what works and what doesn't, let's experiment and create a GUI that holds two JTextAreas, one where the columns and rows property is set and held by the colRowTextArea variable, and another where the preferred size of the JTextArea is set, and call its variable the prefSizeTextArea.

我们将创建一个方法, setUpTextArea(...)我们将JTextArea放入JScrollPane,将它放入JPanel,并有一个按钮,将 lot 文本添加到JTextArea中,并查看添加文本时JTextArea的行为会发生什么。

We'll create a method, setUpTextArea(...) where we place the JTextArea into a JScrollPane, place this into a JPanel, and have a button that adds lots of text into the JTextArea, and see what happens with the behavior of the JTextArea when text is added.

这是代码并按下按钮,亲眼看看哪一个滚动:

Here's the code and push the buttons and see for yourself which one scrolls:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class TwoTextAreas extends JPanel {
    // our nonsense String
    public static final String LoremIpsum = "Lorem ipsum dolor sit amet, "
            + "consectetur adipiscing elit, sed do eiusmod tempor incididunt "
            + "ut labore et dolore magna aliqua. Ut enim ad minim veniam, "
            + "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea "
            + "commodo consequat. Duis aute irure dolor in reprehenderit in "
            + "voluptate velit esse cillum dolore eu fugiat nulla pariatur. "
            + "Excepteur sint occaecat cupidatat non proident, sunt in culpa "
            + "qui officia deserunt mollit anim id est laborum.";
    private static final int ROWS = 30;
    private static final int COLS = 40;
    private static final Dimension TA_PREF_SIZE = new Dimension(440, 480);
    private JTextArea colRowTextArea = new JTextArea(ROWS, COLS);
    private JTextArea prefSizeTextArea = new JTextArea();

    public TwoTextAreas() {
        setLayout(new GridLayout(1, 0));
        prefSizeTextArea.setPreferredSize(TA_PREF_SIZE);

        add(setUpTextArea(colRowTextArea, "Set Columns & Rows"));
        add(setUpTextArea(prefSizeTextArea, "Set Preferred Size"));

    }

    private JPanel setUpTextArea(JTextArea textArea, String title) {
        // allow word wrapping
        textArea.setLineWrap(true);
        textArea.setWrapStyleWord(true);

        JScrollPane scrollPane = new JScrollPane(textArea);

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(new JButton(new AppendTextAction(textArea)));

        JPanel holderPanel = new JPanel(new BorderLayout());
        holderPanel.setBorder(BorderFactory.createTitledBorder(title));
        holderPanel.add(scrollPane);
        holderPanel.add(buttonPanel, BorderLayout.PAGE_END);
        return holderPanel;
    }

    private class AppendTextAction extends AbstractAction {
        private JTextArea textArea;
        private StringBuilder sb = new StringBuilder();

        public AppendTextAction(JTextArea textArea) {
            super("Append Text to TextArea");
            this.textArea = textArea;

            // create nonsense String
            for (int i = 0; i < 100; i++) {
                sb.append(LoremIpsum);
                sb.append("\n");
            }
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            textArea.append(sb.toString());
        }
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("Two TextAreas");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new TwoTextAreas());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

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

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