JScrollPane没有出现在JTextArea上

时间:2017-11-05 20:43:19

标签: java swing jscrollpane layout-manager jtextarea

我试图将JScrollPane添加到我的JTextArea,但不知何故,它不会出现。 我已经尝试根据JTextArea的维度调整它的大小,但它似乎不起作用。另外,请注意我使用的是null布局,因为我希望在指尖位置显示某些按钮和面板的全面灵活性。

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();
  }

}

1 个答案:

答案 0 :(得分:3)

停止与setBoundssetPreferredSize混在一起,你只是让自己的生活变得更加困难。

如果您想影响JTextArea的大小(以及JScrollPane的可见区域),请查看JTextArea构造函数JTextArea(int rows, int columns),这样您就可以指定JTextArea默认为的行/列数,以及允许JTextArea根据当前字体的指标以更稳定的跨平台方式计算preferredSize的行数/列数

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

scrollPane.getViewport().add(notificationBox);
panel.add(notificationBox);

您将notificationBox添加到JScrollPane s JViewport,这很好,但随后您将notificationBox添加到panel,这会将其删除来自JScrollPane的{​​{1}},这是不好的

而是将JViewport添加到JScrollPane

panel

你也过度使用scrollPane.getViewport().add(notificationBox); panel.add(scrollPane); 。我强烈建议你花点时间将static降低到它的绝对最低要求用量,这可能意味着在static方法中构建用户界面,你有一个“主”类您可以进行初始设置(来自main)进行初始设置 - 恕我直言

  

我试过了。我认为其他人建议从另一个帖子中提出,但是当我尝试这个时,它只是从面板上完全拿走了JTextArea

摆脱main并开始使用适当的布局管理器和复合布局。首先查看Laying Out Components Within a Container了解更多详情