GUI未按预期显示

时间:2012-12-27 00:48:58

标签: java swing layout layout-manager jtextarea

我正在尝试绘制如图所示的gui,但不知怎的,我无法将对象放置在正确的位置(我猜问题是布局)textArea假设进入中......但根本没有显示

enter image description here

package Chapter22Collections;
import javax.swing.*;
import java.awt.*;

public class Exercise226 extends JFrame {
    private JButton jbSort;
    private JButton jbReverse;
    private JButton jbAdd;
    private JButton jbShuffle;
    private JLabel jlAddnum;
    private JTextArea jTextDisplay;
    private JTextField jTextAdd;

    public Exercise226() {
        jbSort = new JButton("Sort");
        jbReverse = new JButton("Reverse");
        jbShuffle = new JButton("Shuffle");
        jbAdd = new JButton("Add");
        jlAddnum = new JLabel("Add number here: ");
        jTextDisplay = new JTextArea();
        jTextAdd = new JTextField(8);

        setLayout(new BorderLayout());

        JPanel p1 = new JPanel(new GridLayout(1,3));
        p1.add(jlAddnum);
        p1.add(jTextAdd);
        p1.add(jbAdd);

        JPanel p2 = new JPanel(new GridLayout(1,3));
        p2.add(jbSort);
        p2.add(jbReverse);
        p2.add(jbShuffle);

        add(p1, BorderLayout.NORTH);
        add(jTextDisplay, BorderLayout.CENTER);    
        add(p2, BorderLayout.SOUTH);
    }

    public static void main(String... args) {

        Exercise226 gui = new Exercise226();
        gui.setTitle("Numbers");
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.setSize(300, 200);
        gui.setLocationRelativeTo(null);
        gui.setVisible(true);   

    }     
}

3 个答案:

答案 0 :(得分:4)

JTextArea实际上是您所期望的,但没有轮廓边框。通常将组件放在JScrollPane中会产生这种效果:

add(new JScrollPane(jTextDisplay), BorderLayout.CENTER);

或只是

add(new JScrollPane(jTextDisplay));

答案 1 :(得分:4)

要使textArea重新调整窗口大小,请尝试BoxLayoutBox是“一个轻量级容器,它使用BoxLayout对象作为其布局管理器。”

Box p1 = new Box(BoxLayout.X_AXIS);

答案 2 :(得分:4)

  

如何在框架中的元素之间添加间距/填充?因此,文本区域更加明显和居中。

边框和填充。 E.G。

Exercise226-with-padding-and-borders

与:

相比

Exercise226

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

public class Exercise226 {
    private JButton jbSort;
    private JButton jbReverse;
    private JButton jbAdd;
    private JButton jbShuffle;
    private JLabel jlAddnum;
    private JTextArea jTextDisplay;
    private JTextField jTextAdd;

    private JPanel gui;

    public Exercise226() {
        gui = new JPanel(new BorderLayout(5,5));
        jbSort = new JButton("Sort");
        jbReverse = new JButton("Reverse");
        jbShuffle = new JButton("Shuffle");
        jbAdd = new JButton("Add");
        jlAddnum = new JLabel("Add number here: ");
        // set the size constraints using columns/rows
        jTextDisplay = new JTextArea("Here I am!", 6,20);
        jTextAdd = new JTextField(8);

        JPanel p1 = new JPanel(new GridLayout(1,3,3,3));
        p1.add(jlAddnum);
        p1.add(jTextAdd);
        p1.add(jbAdd);

        JPanel p2 = new JPanel(new GridLayout(1,3,3,3));
        p2.add(jbSort);
        p2.add(jbReverse);
        p2.add(jbShuffle);

        JPanel textAreaContainer = new JPanel(new GridLayout());
        textAreaContainer.add(new JScrollPane(jTextDisplay));
        textAreaContainer.setBorder(new TitledBorder("Text Area Here"));

        gui.add(p1, BorderLayout.PAGE_START);
        gui.add(textAreaContainer, BorderLayout.CENTER);    
        gui.add(p2, BorderLayout.PAGE_END);

        gui.setBorder(new EmptyBorder(4,4,4,4));
    }

    public Container getGui() {
        return gui;
    }

    public static void main(String... args) {
        JFrame f = new JFrame();

        Exercise226 gui = new Exercise226();
        f.setContentPane(gui.getGui());
        f.setTitle("Numbers");
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.pack();
        f.setLocationByPlatform(true);
        f.setVisible(true);   

    }     
}

此代码:

  • 主要在GUI中使用不同的构造函数提供“空白”,这些构造符接受2个int参数用于水平&垂直间距。
  • 还添加了2个边框:
    1. 整个GUI周围的空边框,以在它与框架装饰之间提供一些间距。
    2. 文本区域周围的标题边框,使其非常明显。
  • 是否对原始代码的一个不必要部分实施更改。它不是扩展框架,而只是保留一个实例。
  • 根据@Reimeus的建议,使用文本区域的JScrollPane容器。它为一个不需要滚动条的元素添加了一个漂亮的斜面边框。
  • 专门创建textAreaContainer,以便我们可以设置标题边框以围绕滚动窗格 - ,而不会干扰其现有边框。
    对于包含现有边框(CompoundBorder)和&的滚动窗格,可以使用scroll.getBorder()。标题边界。然而,按钮和按钮变得复杂。其他可能会改变选择或行动边界的元素。因此,要为屏幕元素(如此处的文本区域)设置“最外边框” - 我通常更喜欢先将整个组件包装在另一个容器中。
  • 不在EDT上创建和显示GUI。应该在EDT上创建和修改Swing GUI。留下作为用户的练习。有关详细信息,请参阅Concurrency in Swing

旧代码

此答案的原始代码提供了上面看到的“比较GUI图像”。 IT紧密地基于原始代码,但文本区域包裹在滚动窗格中(并因此而获得斜面边框)&给出一些要显示的文字。

Exercise226

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

public class Exercise226 extends JFrame {
    private JButton jbSort;
    private JButton jbReverse;
    private JButton jbAdd;
    private JButton jbShuffle;
    private JLabel jlAddnum;
    private JTextArea jTextDisplay;
    private JTextField jTextAdd;

    public Exercise226() {
        jbSort = new JButton("Sort");
        jbReverse = new JButton("Reverse");
        jbShuffle = new JButton("Shuffle");
        jbAdd = new JButton("Add");
        jlAddnum = new JLabel("Add number here: ");
        // set the size constraints using columns/rows
        jTextDisplay = new JTextArea("Here I am!", 6,20);
        jTextAdd = new JTextField(8);

        setLayout(new BorderLayout());

        JPanel p1 = new JPanel(new GridLayout(1,3));
        p1.add(jlAddnum);
        p1.add(jTextAdd);
        p1.add(jbAdd);

        JPanel p2 = new JPanel(new GridLayout(1,3));
        p2.add(jbSort);
        p2.add(jbReverse);
        p2.add(jbShuffle);

        add(p1, BorderLayout.NORTH);
        add(new JScrollPane(jTextDisplay), BorderLayout.CENTER);    
        add(p2, BorderLayout.SOUTH);
    }

    public static void main(String... args) {

        Exercise226 gui = new Exercise226();
        gui.setTitle("Numbers");
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //gui.setSize(300, 200);
        gui.pack();
        //gui.setLocationRelativeTo(null);
        gui.setLocationByPlatform(true);
        gui.setVisible(true);   

    }     
}