GUI JTextArea& JScrollPane&定位

时间:2014-01-07 23:33:30

标签: java swing layout-manager

我想添加到窗口,从x,y位置JTextArea开始添加滚动条。 问题是,当我对代码进行可视化时,它确实填充了500x500窗口,我确实希望在x,y pos只填充200x200的完整。

我做错了什么?这是我的代码:

public static void main(String args[])
{
    JFrame window = new JFrame();
    window.setSize(500, 500);
    window.setResizable(false);

    JTextArea ta = new JTextArea("Default message");
    ta.setEditable(true);

    JScrollPane scroll = new JScrollPane(ta);
    scroll.setBounds(10,10,200,200);
    window.add(scroll);

    window.setVisible(true);
}

2 个答案:

答案 0 :(得分:4)

不要使用setBounds()来设置组件的大小。 Swing使用布局管理器来调整组件的大小。

默认情况下,JFrame使用BorderLayout,您将组件添加到CENTER,以便组件占用所有可用空间。

取而代之的是:

JTextArea text Area = new JTextArea(5, 40);
JScrollPane scrollPane = new JScrollPane( textArea );
frame.add(scrollPane, BorderLayout.NORTH);
frame.pack();
frame.setVisible();

当您显示框架时,文本区域将占据整个空间,但如果您将框架调整为更大,则文本区域将仅显示在NORTH中,并且CENTER中将有空白区域。

答案 1 :(得分:3)

Padded Text Area

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class PaddedTextArea {

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                // the GUI as seen by the user (without frame)
                JPanel gui = new JPanel(new BorderLayout());
                // adjust as needed
                gui.setBorder(new EmptyBorder(20,10,20,10));

                // better way to size a text area is using columns/rows 
                // in the constructor
                JTextArea ta = new JTextArea(3,40);
                JScrollPane sp = new JScrollPane(ta);
                gui.add(sp);

                JFrame f = new JFrame("Padded Text Area");
                f.add(gui);
                // Ensures JVM closes after frame(s) closed and
                // all non-daemon threads are finished
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                // See https://stackoverflow.com/a/7143398/418556 for demo.
                f.setLocationByPlatform(true);

                // ensures the frame is the minimum size it needs to be
                // in order display the components within it
                f.pack();
                // should be done last, to avoid flickering, moving,
                // resizing artifacts.
                f.setVisible(true);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}

更一般地说:Java GUI可能必须在许多平台上工作,在不同的屏幕分辨率和使用不同的PLAF。因此,它们不利于组件的精确放置。要组织强大的GUI组件,而是使用布局管理器,或combinations of them 1 ,以及布局填充和& white space 2 的边框。