我一直在尝试为我的编程语言编写一个基本的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> 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从来没有真正出现过,我对它们很陌生。
答案 0 :(得分:0)
在重新调整组件大小时,框布局不具备很大的灵活性。这是一个类似问题的链接。您可能想尝试不同的布局管理器。
答案 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> 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> 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内部面板。这将为您提供一个完整的框架,您可以在其中指定文本区域周围的百分比或固定像素数量,因此无论窗口的大小如何,布局都会将自身调整到适当的距离。