【问题标题】:JFrame Layout: Header and 2 Text AreasJFrame 布局:页眉和 2 个文本区域
【发布时间】:2015-11-10 11:41:24
【问题描述】:

我一直在尝试为我的编程语言编写一个基本的 IDE,但我对 JFrames 没有太多经验。我正在尝试设置它,使窗口有一个主标题,然后在它下面有两个文本区域。我可以把标题全部整理出来;它只是在窗口中居中的 3 个标签。但我无法让这两个文本区域工作。到目前为止我只尝试过一个,我已经看到很多错误的东西。每当我调整窗口大小时,它不会停留在标题下方(这是一个盒子布局),而是在它旁边。我还想让它在窗口改变大小时增加文本区域的大小。这是我目前的代码(只有一个文本区域)。

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% 的边距。最后一点是,我的语言当前解释代码的方式是通过一个文件,然后循环遍历每一行。我怎样才能使用左侧文本区域中输入的所有代码来执行此操作?

目前我拥有的:

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

【问题讨论】:

  • Java 不是 Javascript。 Laying out a GUI with Swing 与使用 HTML 和 Javascript 布局页面完全不同。
  • “很抱歉问了这么多问题。”鉴于这是一个问答网站,问题是必要的而不是我们需要道歉的东西.问很多问题也可以,只要每个问题都是独立的、经过充分研究和仔细编写的。

标签: java swing jframe layout-manager jtextarea


【解决方案1】:

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

BoxLayout stretches component to fit parent panel

【讨论】:

【解决方案2】:

您可能应该首先将所有内容放入 JPanel 并将 that 添加到框架中,而不是直接将所有内容添加到框架中。

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

我为 BoxLayout 设置了 Y_AXIS 对齐方式,以便组件从上到下排列。但是,您如何并排显示两个标题?在 mainPanel 中嵌套另一个 JPanel:

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 以便将 JLabels 向右对齐,这样如果窗口的宽度太小,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 个盒子,一个宽度大约为屏幕的 65%,另一个宽度为 20%,我仍然不太确定 Flow Layouts 及其工作原理。感谢您提供到目前为止的代码!
  • 如果您愿意,您应该将整个信息面板嵌套到标题面板中,而不是直接将标语和版本标签放入标题面板中。在这种情况下,您应该将title 的布局设置为在 y 轴上对齐的框布局,以便它们出现在标题下方。要拥有两个具有特定大小的框,请查看 JLabels 和 JPanels 的 setMaximumSize 和 setPreferredSize。
  • 一个问题,我怎样才能在文本区域上方有两个标题,向左对齐?第一个 textarea 的标题为 Code:,第二个的标题为 Console:Thanks,
  • 如果您希望它们完全位于左侧,那么您可以将mainPanel 中的所有内容放入名为content 的面板中。制作另一个名为titles 的面板,将其设置为垂直框布局,然后添加要添加的两个标签。然后将原来mainPanel的布局设置为水平布局。如果您添加title,然后添加content,它应该看起来好像标题在内容的左侧,尽管您可能需要稍微调整一下大小。但是,如果您想将标题与内容混合在一起,则必须将它们添加到现有面板中。
  • 另外,我尝试通过在 textareas 之后添加的新 jpanel 向我的 jframe 添加一个按钮,但现在较小的 textarea 没有显示?这是我的新代码:pastebin.com/mQ4HrDUY。抱歉不清楚,我的意思是将标题直接放在文本区域的上方,但在顶部的左侧,而不是在上方居中。希望它更清楚。 :)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2013-04-21
    • 2020-10-04
    • 1970-01-01
    相关资源
    最近更新 更多