将JScrollPane添加到JPanel中的JTextArea

时间:2016-11-06 15:25:48

标签: java swing jpanel jscrollpane jtextarea

我正在尝试将JScrollPane添加到我的大型JTextArea中,但每当我包含JScrollPane代码时,我的整个JTextArea都会消失。

public myGUI() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 1174, 656);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);
    contentPane.setVisible(true);

    JTextArea textArea_1 = new JTextArea();
    textArea_1.setBounds(203, 5, 869, 440);
    textArea_1.setEditable(true);
    textArea_1.setVisible(true);
    contentPane.add(textArea_1);

    JScrollPane scroll = new JScrollPane (textArea_1);
    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    contentPane.add(scroll);

}

2 个答案:

答案 0 :(得分:6)

您的代码有几个问题:

  • 您正在尝试将一个名为textArea_1的JTextArea组件添加到多个容器,这里是contentPane JScrollPane。您无法在Swing中执行此操作,因为组件只能添加到一个组件中。仅将其添加到JScrollPane而不是添加到contentPane,然后将滚动窗格添加到GUI。
  • 您通过setBounds约束JTextArea的大小,几乎可以保证JScrollPane无法正常工作,因为这样可以防止JTextArea在保存的文本多于显示的情况下进行扩展。而是设置JScrollPane的行和列属性而不是其边界。这将是它应在滚动窗格中显示的行数和列数
  • 您使用的是null布局,但没有指定JScrollPane的大小,因此默认大小为[0,0] - ,这就是您的JTextArea消失的原因。空布局需要完整规范所有组件尺寸和位置。
  • 您正在使用空布局来设置GUI。虽然null布局和setBounds()似乎是Swing新手,比如创建复杂GUI的最简单和最好的方法,但是你创建的Swing GUI越多,在使用它们时会遇到更严重的困难。当GUI调整大小时,它们不会调整组件的大小,它们是增强或维护的皇室女巫,当它们被放置在滚动窗格中时它们完全失败,当它们在所有平台上观看时或者与原始平台不同的屏幕分辨率时它们看起来很糟糕

例如:

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

@SuppressWarnings("serial")
public class MyGuiPanel extends JPanel {
    // some row and column values for our JTextArea
    private static final int TXT_AREA_ROWS = 25;
    private static final int TXT_AREA_COLS = 80;

    // create the JTextArea, passing in the rows and columns values
    private JTextArea textArea = new JTextArea(TXT_AREA_ROWS, TXT_AREA_COLS);

    public MyGuiPanel() {
        // create the JScrollPane, adding our JTextArea
        JScrollPane scroll = new JScrollPane(textArea);
        scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        // lets add some buttons to the bottom of the GUI just for fun
        JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0));
        buttonPanel.add(new JButton("Save"));
        buttonPanel.add(new JButton("Open"));
        buttonPanel.add(new JButton("Delete"));
        buttonPanel.add(new JButton("Exit"));

        // let's add a title to the top:
        JLabel title = new JLabel("This is my Applications's Title", SwingConstants.CENTER);
        title.setFont(title.getFont().deriveFont(Font.BOLD, 24)); // and make
                                                                  // the text
                                                                  // *BIG*

        // use a BorderLayout for our GUI
        setLayout(new BorderLayout(5, 5));
        setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        add(scroll, BorderLayout.CENTER); // add the scrollpane to the center
        add(buttonPanel, BorderLayout.PAGE_END); // the button panel to the
                                                 // bottom
        add(title, BorderLayout.PAGE_START); // and the title JLabel to the top
    }

    private static void createAndShowGui() {
        // create our GUI JPanel
        MyGuiPanel mainPanel = new MyGuiPanel();

        // create a JFrame to add it to
        JFrame frame = new JFrame("My GUI");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel); // add the GUI to the JFrame
        frame.pack(); // tell the layout managers to do their work
        frame.setLocationByPlatform(true);
        frame.setVisible(true); // display the GUI
    }

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

此外,如果您的程序扩展了JFrame,请了解您是通过这样做在角落里绘画自己,迫使您创建和显示JFrame,这通常需要更多的灵活性。事实上,我冒昧地说,我创建的大部分Swing GUI代码和我见过的扩展了JFrame,事实上你很少想做这个。更常见的是,您的GUI类将面向创建JPanels,然后可以将其放置到JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts交换。这将大大提高GUI编码的灵活性。

答案 1 :(得分:2)

您的JTextArea不需要setBounds。因为您使用的是null布局而且JScrollPane没有边界,所以没有任何显示。您的JTextArea也被添加到两个会导致一些问题的地方。我会推荐任何摆动layout managers。作为使用BorderLayout的一个例子,它是最简单的管理者之一:

public mygui() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    setSize(700, 500);
    setLayout(new BorderLayout());

    JTextArea textArea_1 = new JTextArea();
    textArea_1.setEditable(true);

    JScrollPane scroll = new JScrollPane(textArea_1);
    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

    add(scroll, BorderLayout.CENTER);
}