3

我正在尝试绘制如图所示的 gui,但不知何故我无法将对象放置在正确的位置(我猜问题出在布局上) textArea 应该在中间。 . 但根本没有显示

在此处输入图像描述

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);   

    }     
}
4

3 回答 3

4

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

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

或者干脆

add(new JScrollPane(jTextDisplay));
于 2012-12-27T00:58:48.010 回答
4

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

Box p1 = new Box(BoxLayout.X_AXIS);
于 2012-12-27T02:01:54.797 回答
4

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

边框和填充。例如

练习 226-with-padding-and-borders

和....相比:

练习226

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);   

    }     
}

这段代码:

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

旧代码

这个答案的原始代码提供了上面看到的“比较 GUI 图像”。IT 与原始代码密切相关,但文本区域包裹在滚动窗格中(并因此获得斜角边框)并给出了一些要显示的文本。

练习226

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);   

    }     
}
于 2012-12-27T02:46:24.440 回答