Почему моя JScrollPane с JTextArea не видна при использовании null LayoutManager?
Я пытаюсь отобразить 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();
}
}
Я использую null LayoutManager, чтобы соответствовать учебнику, из которого я преподаю.
2 ответа:
Это будет работать:
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(); } }
Если используется нулевая компоновка, то необходимо указать границы.
Edit
setBounds()
метод охватывает задачу методаsetLocation()
.Например,
setBounds(x,y,w,h);
Первые 2 установят местоположение X / y этого компонента относительно его контейнера. второй 2 (w/h) установит размер этого компонента.
Другими словами: -
- setBounds(int x, int y, int witdh, int height) - устанавливает компоненты размер и расположение
- setLocation(int x, int y) - задает местоположение компонента
Я должен согласиться с замечанием Клеопатры по этому поводу.
Вот вариант кода Гарри Джоя, который использует макеты. Он появляется на экране почти того же размера, что и исходный графический интерфейс, но может быть изменен. Он также легко адаптируется к различным плафонам, размерам шрифтов по умолчанию и т. д. (хотя это может закончиться другим размером на экране), тогда как что-то с макетом
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); } }