文本字段setBounds函数不适用于特定的JFrame

时间:2020-06-14 21:02:27

标签: java swing

我正在尝试创建一个包含3个文本字段的JPanel。除textArea3之外的所有其他内容(包括按钮)都已放置到位。最后的面板是这样的。如图所示,textArea3使用整个JFrame而不是遵循setBounds方法。

    //Text Area 1
    JTextArea textArea = new JTextArea();

    JScrollPane jScrollPane1 = new JScrollPane(textArea);
    jScrollPane1.setVerticalScrollBarPolicy(
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    jScrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    textArea.setWrapStyleWord(true);
    textArea.setLineWrap(true);
    textArea.setFont(new Font("Consolas", Font.LAYOUT_LEFT_TO_RIGHT, 20));

    JTextArea textArea2 = new JTextArea();
    JScrollPane jScrollPane2 = new JScrollPane(textArea2);
    jScrollPane2.setVerticalScrollBarPolicy(
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    jScrollPane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    textArea2.setWrapStyleWord(true);
    textArea2.setLineWrap(true);
    textArea2.setFont(new Font("Consolas", Font.LAYOUT_LEFT_TO_RIGHT, 20));

    //Text Area 3
    JTextField textArea3 = new JTextField();
    textArea3.setFont(new Font("Consolas", Font.LAYOUT_LEFT_TO_RIGHT, 20));

    jScrollPane1.setBounds(30,30,300,300);
    jScrollPane2.setBounds(30,400,200,200);
    //textArea3 is not working
    textArea3.setBounds(600,800,100,50);
    button2.setBounds(350,30,80,30);

    button1.setBounds(350,400,80,30);
    frame.add(button1);
    frame.add(button2);
    frame.add(jScrollPane2);
    frame.add(jScrollPane1);
    frame.add(textArea3);

    frame.setVisible(true);

编辑:因此,这可能是JDK中的错误。我制作了另一个称为类框架的类,并设置了产生文本区域等的方法。

textArea3 uses entire JFrame and is not getting bound

1 个答案:

答案 0 :(得分:0)

如您在图片中所见,textArea3使用整个JFrame而不是遵循setBounds方法。

不,我看不到。我看到5个组件。我看不到任何使用整个框架的组件。

如果实际上您确实看到文本区域占据了整个框架,那是因为:

  1. JFrame的默认布局管理器是BorderLayout
  2. 当您将组件添加到BorderLayout且未指定约束时,将采用CENTER。
  3. 但是,只有一个组件可以显示在CENTER中,因此布局管理器只会为最后添加的组件(恰好是textArea3)提供大小/位置。

其他组件恰好出现是因为您手动设置了每个组件的边界。

您不应尝试设置组件的边界。布局管理器的工作是设置每个组件的大小和位置。

因此解决方案是摆脱所有setBounds()语句并使用布局管理器。

阅读Layout Managers上Swing教程中的部分,以获取更多信息。看来您想使用网格,因此可以使用GridBagLayout

此外,当您创建JTextArea时,应使用类似以下内容的东西:

JTextArea textArea = new JTextArea(15, 20); 

这将允许文本区域计算其大小,以便显示15行,每行大约显示20个字符。大小将根据所使用的字体进行计算。