JFrame布局:标题和2个文本区域

时间:2015-08-17 18:19:41

标签: java swing jframe layout-manager jtextarea

我一直在尝试为我的编程语言编写一个基本的IDE代码,但我对JFrames没有多少经验。我试图设置它,以便窗口有一个主标题,然后在它下面有两个文本区域。我可以将标题全部整理出来;它只是窗口中心的3个标签。但我无法让两个文本区域起作用。到目前为止我只尝试了一个,我已经看到了大量的错误。每当我调整窗口大小时,它都不会停留在标题下方(这是一个Box布局),但它会在旁边。我还希望这样做,以便当窗口改变大小时文本区域的大小增加。这是我到目前为止的代码(这只有一个文本区域)。

JFrame frame = new JFrame("DotDotIO");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
frame.setPreferredSize(new Dimension(800,600));
frame.setMinimumSize(new Dimension(600,450));

Box titleText = Box.createHorizontalBox();
JLabel title = new JLabel("<html><span style='color: teal;'>DotDotIO</span></html>");
title.setFont (title.getFont().deriveFont(64.0f));
JLabel version = new JLabel("<html>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Version 1.0<br>Created by Luke Carr</html>");
JLabel slogan = new JLabel("<html>Full Potential<br>Minimal Knowledge</html>");
titleText.add(version);
titleText.add(title);
titleText.add(slogan);
titleText.setAlignmentX(frame.getWidth() / 2);

Box inputContent = Box.createHorizontalBox();
JTextArea code = new JTextArea(35,65);
code.setEditable(true);
code.setBorder(null);
inputContent.add(code);

frame.add(titleText);
frame.add(inputContent);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);

我目前已将其设置为使文本区域具有固定大小,但我希望将其设置为使左侧文本区域的宽度为屏幕的65%,右侧文本区域占据文本区域的15%屏幕,两边都有5%的边距,两边都有5%的边距。最后要注意的是,我的语言当前解释代码的方式是通过文件,然后循环遍历每一行。如何使用左侧文本区域中键入的所有代码执行此操作?

目前我所拥有的:

Link to Image

很抱歉问了这么多问题。虽然我已经做了很长时间的Java,但JFrames从来没有真正出现过,我对它们很陌生。

3 个答案:

答案 0 :(得分:0)

在重新调整组件大小时,框布局不具备很大的灵活性。这是一个类似问题的链接。您可能想尝试不同的布局管理器。

BoxLayout stretches component to fit parent panel

答案 1 :(得分:0)

你应该首先将所有内容放入JPanel并将那个添加到框架中,而不是直接将所有内容添加到框架中。

JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS))
...
frame.getContentPane().add(mainPanel);

我为BoxLayout提供了Y_AXIS的对齐方式,以便组件从上到下。但是,你如何并排显示两个标题?将另一个JPanel嵌套在mainPanel

JPanel info = new JPanel();
info.setLayout(new FlowLayout(FlowLayout.RIGHT, 50, 10));

JLabel version = new JLabel("<html>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Version 1.0<br>Created by Luke Carr</html>");
info.add(version);  

JLabel slogan = new JLabel("<html>Full Potential<br>Minimal Knowledge</html>");
info.add(slogan);

mainPanel.add(info);

我将它设置为FlowLayout以便将JLabel对齐到右边,这样如果窗口的宽度太小,那么Swing将自动垂直重新对齐它们。还有很多其他方法可以做到这一点,但这是我喜欢的方式。将组件对齐到右边可以得到您想要的65/15比例。如果这不是您想要的,您可以将其更改为FlowLayout.CENTER,FlowLayout.LEFT等.FlowLayout的构造函数中的50和10是组件之间的垂直和水平间距。

要在它们的两边创建5%的边距,我只需将整个mainPanel的边框设置为每边延伸10个像素的空边框

mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

如果您只想在版本号和标语周围添加边框,请以相同的方式设置info的边框。

关于你的上一个问题:要逐行阅读代码,请使用code.getText()并使用String.split()将其拆分,如上所述here

我重写了代码并更改了一些设置:

import java.awt.FlowLayout;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class Main
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("DotDotIO");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
        mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

        JPanel title = new JPanel();

        JLabel header = new JLabel("<html><span style='color: teal;'>DotDotIO</span></html>");
        header.setFont(header.getFont().deriveFont(64.0F));

        title.add(header);

        mainPanel.add(title);
        mainPanel.add(Box.createVerticalStrut(10));

        JPanel info = new JPanel();
        info.setLayout(new FlowLayout(FlowLayout.RIGHT, 50, 10));

        JLabel version = new JLabel("<html>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Version 1.0<br>Created by Luke Carr</html>");
        info.add(version);  

        JLabel slogan = new JLabel("<html>Full Potential<br>Minimal Knowledge</html>");
        info.add(slogan);

        mainPanel.add(info);
        mainPanel.add(Box.createVerticalStrut(20));

        JPanel codePanel = new JPanel();

        JTextArea code = new JTextArea(25, 65);
        codePanel.add(code);

        mainPanel.add(codePanel);

        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setVisible(true);
    }
}

如果我误解了你的问题,请发表评论。我希望这会有所帮助。

--- 编辑 ----------------

FlowLayout的工作方式是将组件放在特定方向,直到到达窗口边缘;然后它“命中返回”并且组件被放置在第一行组件下面。这就是两个标签按照它们的方式对齐的方式,如果屏幕尺寸太小,它们可以垂直对齐。

答案 2 :(得分:0)

我会考虑使用BorderLayout,并使用Insets内部面板。这将为您提供一个完整的框架,您可以在其中指定文本区域周围的百分比或固定像素数量,因此无论窗口的大小如何,布局都会将自身调整到适当的距离。