JScrollPane不适用于JTextArea

时间:2015-05-30 12:40:59

标签: java swing jscrollpane jtextarea

我正在尝试将ScrollPane添加到我的TextArea,但它没有出现。 这是代码:

import javax.swing.*;

public class PracownikGui extends JFrame {

private JPanel Panelek;
private JTextArea Tekscik;
private JScrollPane Skrol;

public PracownikGui() {

    setMinimumSize(new Dimension(600, 600));
    setLocationRelativeTo(null);
    setContentPane(Panelek);
    setResizable(false);
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);

    Tekscik();

public void Tekscik() {
    Tekscik = new JTextArea(2, 10);
     Skrol = new JScrollPane( Tekscik );
     Tekscik.setSize(300, 300);
     Tekscik.setLocation(20, 70);
     Tekscik.setEditable(true);
     Tekscik.setLineWrap(true);
      add(Tekscik);
}}

请帮助。

2 个答案:

答案 0 :(得分:2)

您可以通过设置JTextArea的大小或preferredSize来拍摄自己,因为这会阻止它扩展到JScrollPane:

 Tekscik.setSize(300, 300);

仅设置其行和列。

此外,您需要将JScrollPane添加到GUI,而不是JTextArea。

此外,虽然null布局和setBounds()setSize(...)setLocation(...)似乎是Swing新手,比如创建复杂GUI的最简单和最好的方法,但是你创建的Swing GUI越多使用它们时会遇到严重的困难。当GUI调整大小时,它们不会调整组件的大小,它们是增强或维护的皇室女巫,当它们被放置在滚动窗格中时它们完全失败,当它们在所有平台上观看时或者与原始平台不同的屏幕分辨率时它们看起来很糟糕

如,

import javax.swing.*;

public class PracownikPanel extends JPanel {
   private JTextArea tekscik = new JTextArea(5, 25);

   public PracownikPanel() {
      tekscik.setLineWrap(true);
      tekscik.setWrapStyleWord(true);
      JScrollPane skrol = new JScrollPane(tekscik);
      skrol.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

      add(skrol);
   }

   private static void createAndShowGui() {
      PracownikPanel mainPanel = new PracownikPanel();

      JFrame frame = new JFrame("PracownikPanel");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

答案 1 :(得分:2)

我对您的代码做了很多更改。你的代码不会运行。

这是我创建的GUI。

Scroll Pane Test

如您所见,有一个垂直滚动条。滚动条的默认操作是,在您使用文本填充JTextArea之前,它不会显示。

以下是我对您的代码所做的重要更改。

  1. 班级名称以大写字母开头。方法名称和变量名称以小写字母开头。

  2. Swing应用程序必须以调用SwingUtilities invokeLater方法开始。这可确保在Event Dispatch thread(EDT)上创建和使用Swing组件。由于invokeLater方法需要Runnable,因此我让PracownikGui类实现了Runnable。

  3. 您使用Swing组件。除非要覆盖该类中的某个方法,否则不要扩展Swing组件或任何其他Java类。

  4. 除了定义JTextArea的行和列的语句之外,我删除了所有大小调整和定位语句。 Hovercraft Full Of Eels解释了这一点,但您使用Swing layouts来获取所需的Swing组件的排列方式。 JPanel的默认布局是FlowLayout。 JFrame的默认布局是BorderLayout。

  5. 我将JScrollPane添加到JPanel。我将JPanel添加到JFrame。

  6. 这是代码。

    package com.ggl.testing;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.SwingUtilities;
    
    public class PracownikGui implements Runnable {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new PracownikGui());
        }
    
        private JFrame frame;
        private JPanel panelek;
        private JTextArea tekscik;
        private JScrollPane skrol;
    
        @Override
        public void run() {
            frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
    
            panelek = new JPanel();
            tekscik(panelek);
            frame.setContentPane(panelek);
    
            frame.setResizable(false);
            frame.pack();
            frame.setVisible(true);
        }
    
        public void tekscik(JPanel panelek) {
            tekscik = new JTextArea(2, 20);
            tekscik.setEditable(true);
            tekscik.setLineWrap(true);
    
            skrol = new JScrollPane(tekscik);
            panelek.add(skrol);
        }
    }