Java JScrollPane未出现在JTextArea上

Java JScrollPane未出现在JTextArea上,java,swing,jscrollpane,layout-manager,jtextarea,Java,Swing,Jscrollpane,Layout Manager,Jtextarea,我试图将JScrollPane添加到我的JTextArea中,但不知怎么的,它不会出现。 我试着根据JTextArea的维度调整它的大小,但似乎不起作用。另外,请注意,我之所以使用空布局,是因为我希望在精确的位置显示某些按钮和面板具有充分的灵活性 import java.awt.Dimension; import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JPanel; import javax.s

我试图将JScrollPane添加到我的JTextArea中,但不知怎么的,它不会出现。 我试着根据JTextArea的维度调整它的大小,但似乎不起作用。另外,请注意,我之所以使用空布局,是因为我希望在精确的位置显示某些按钮和面板具有充分的灵活性

import java.awt.Dimension;
import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.JTextArea;

public class PaneTester{

  private static JFrame frame;
  private static JPanel panel;
  private static JScrollPane scrollPane;
  private static JTextArea notificationBox;

  public static void main (String [] args){
    stage1(); 
    stage2();
  }

  private static void stage1(){
    createFrame();
    createPanel();
    frame.getContentPane().add(panel);
    panel.setVisible(true);
    frame.setVisible(true);
  }

  private static void stage2(){
    generateNotificationBox();
  }

  private static void createFrame(){
    frame = new JFrame();
    frame.setSize(new Dimension(900,700)); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(true);
  }

  private static void createPanel(){
    panel = new JPanel();
    panel.setLayout(null);
    generateGridButtons();
  }

  private static void generateGridButtons(){
    short y = 0; 
    for(short i=0;i<4;i++){
      y += 60;
      short x = 500;
      for(short j=0;j<5;j++){
        JButton gridButton = new JButton();
        gridButton.setBounds(x, y,120,60);
        panel.add(gridButton);
        x += 140;
      }
    }    
  }
  public static void generateNotificationBox(){
    notificationBox = new JTextArea(10,10);
    notificationBox.setBounds(25, 25, 200, 400);
    scrollPane = new JScrollPane(notificationBox, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
                                 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS ); 

    Dimension d = new Dimension(notificationBox.getPreferredSize());
    scrollPane.getViewport().setPreferredSize(d);
    scrollPane.getViewport().add(notificationBox);
    panel.add(notificationBox);
    panel.repaint();
  }

}
导入java.awt.Dimension;
导入java.awt.BorderLayout;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JButton;
导入javax.swing.JScrollPane;
导入javax.swing.ScrollPaneConstants;
导入javax.swing.JTextArea;
公营坦克{
私有静态JFrame;
专用静态JPanel面板;
私有静态JScrollPane滚动窗格;
专用静态JTextArea通知框;
公共静态void main(字符串[]args){
阶段1();
阶段2();
}
私有静态void stage1(){
createFrame();
createPanel();
frame.getContentPane().add(面板);
面板设置可见(真);
frame.setVisible(true);
}
私有静态void stage2(){
generateNotificationBox();
}
私有静态void createFrame(){
frame=新的JFrame();
框架设置尺寸(新尺寸(900700));
setExtendedState(JFrame.MAXIMIZED_二者);
frame.setLocationRelativeTo(空);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setresizeable(true);
}
私有静态void createPanel(){
panel=新的JPanel();
panel.setLayout(空);
generateGridButtons();
}
私有静态void generateGridButtons(){
短y=0;

因为(简言之,i=0;i停止使用
setBounds
setPreferredSize
),你只是让自己的生活变得更加困难

如果要影响
JTextArea
的大小(以及
JScrollPane
的可视区域)查看
JTextArea
构造函数,它允许您指定希望
JTextArea
默认为的行/列数,并允许
JTextArea
以更稳定的跨平台方式基于当前字体的度量来计算其
preferredSize

然而,你的核心问题就在这里

scrollPane.getViewport().add(notificationBox);
panel.add(notificationBox);
notificationBox
添加到
JScrollPane
s
JViewport
,这很好,但随后将
notificationBox
添加到
面板
,这会将其从
JScrollPane
JViewport
中删除,这很糟糕

相反,将
JScrollPane
添加到
面板

scrollPane.getViewport().add(notificationBox);
panel.add(scrollPane);
您还过度使用了
static
。我强烈建议您花点时间将
static
降低到它所需的绝对最低使用量,这可能意味着,您可以不满足地使用
main
方法构建UI,而不是使用
main
方法构建UI将执行初始设置-IMHO


我已经试过了。我想其他人在另一篇文章中建议过,但当我试过的时候,它只是把JTextArea从面板上完全拿走了


去掉
panel.setLayout(null);
并开始使用适当的布局管理器和复合布局。从查看更多细节开始

我已经尝试过了。我想其他人在另一篇文章中建议了这一点,但当我尝试时,它只是将JTextArea完全从面板中移除。去掉
面板。setLayout(null)
这是解决这个问题的唯一方法吗?我想知道是否有一种方法可以在保持空布局的同时做到这一点。这是首选的、长期的方法,不会继续影响您,solution.Swing(和大多数现代GUI框架)依靠某种自动布局机制,这解决了大量与DPI、字体渲染、可变屏幕大小等相关的问题issues@Pvo考虑到我自己和其他开发人员使用Swing创建的复杂UI的数量,我发现如果一个布局管理器做不到,那么使用多个布局管理器是极不可能的如果你真的找不到一个或多个布局管理器来完成你的工作,那么就考虑写你自己的——从长远来看,它们会为你节省更多的时间和头痛,然后用OUT <代码>做,但是没有任何我能用的理想的布局管理器。完美的可视化我的程序
-没有人建议只使用一个布局管理器。您可以使用不同的布局嵌套每个面板,以对组件进行逻辑分组。例如,由20个按钮组成的网格表示使用网格布局。