Почему мой JScrollPane с JTextArea видимым при использовании нулевого LayoutManager? - PullRequest
4 голосов
/ 07 апреля 2011

Я пытаюсь отобразить JTextArea в JScrollPane, но я просто получаю пустой кадр при запуске моей (упрощенной) программы:

import java.awt.Container;
import java.awt.Dimension;    
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class ScrollPaneTest extends JFrame {
    private Container myCP; 
    private JTextArea resultsTA;
    private JScrollPane scrollPane;

    public ScrollPaneTest() {
        setSize(500, 500);
        setLocation(100, 100);
        myCP = this.getContentPane();
        myCP.setLayout(null);

        resultsTA = new JTextArea("Blah blah");
        scrollPane = new JScrollPane(resultsTA,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane.setPreferredSize(new Dimension(200, 100));
        scrollPane.setLocation(100, 300);
        myCP.add(scrollPane);

        setVisible(true);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    public static void main(String[] args) {
        new ScrollPaneTest();
    }
}

Я использую нулевой LayoutManager, чтобы соответствовать учебнику, из которого я преподаю.

Ответы [ 2 ]

7 голосов
/ 07 апреля 2011

Это будет работать:

public class ScrollPaneTest extends JFrame {
    private Container myCP; 
    private JTextArea resultsTA;
    private JScrollPane scrollPane;

    public ScrollPaneTest() {
        setSize(500, 500);
        setLocation(100, 100);
        myCP = this.getContentPane();
        myCP.setLayout(null);

        resultsTA = new JTextArea("Blah blah");
        resultsTA.setBounds(10, 10, 150, 30);

        scrollPane = new JScrollPane(resultsTA,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane.setPreferredSize(new Dimension(200, 100));
        scrollPane.setBounds(0, 0, 500, 500);

        myCP.add(scrollPane);
        setVisible(true);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    public static void main(String[] args) {
        new ScrollPaneTest();
    }
}

Если вы используете нулевую разметку, вы должны указать границы.


Редактировать

setBounds() метод решает задачу метода setLocation().

например, setBounds(x,y,w,h);

first 2 установит местоположение x / y этого компонента относительно его контейнера. второй 2 (w / h) установит размер этого компонента.

другими словами: -

  1. setBounds (int x, int y, int witdh, int height) - устанавливает размер и расположение компонента
  2. setLocation (int x, int y) - устанавливает местоположение компонента
1 голос
/ 07 апреля 2011

Я должен согласиться с комментарием Клеопатры по этому поводу.

Вот вариант кода Гарри Джоя, который использует макеты. Он выглядит на экране почти такого же размера, как и оригинальный графический интерфейс, но с изменяемым размером. Он также легко адаптируется к разным PLAF, размерам шрифтов по умолчанию и т. Д. (Хотя на экране может получиться другой размер), тогда как что-то с макетом null не будет.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ScrollPaneTest extends JFrame {
    private Container myCP;
    private JTextArea resultsTA;
    private JScrollPane scrollPane;

    public ScrollPaneTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocation(100, 100);
        myCP = this.getContentPane();

        resultsTA = new JTextArea("Blah blah", 28, 43);

        scrollPane = new JScrollPane(resultsTA,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        myCP.add(scrollPane);
        setVisible(true);
        pack();
    }

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