У меня есть простая Java-программа, в которой у меня есть JLayeredPane с BorderLayout, содержащим три JPanels. Внутри JLayeredPane панели JPanel расположены ЗАПАД, ЦЕНТР, ВОСТОК.

Когда я изменяю размер окна программы, сначала весь макет изменяется хорошо, но когда я сжимаю его до тех пор, пока он не достигнет ВОСТОК или ЗАПАДА, возникает проблема с JComponents выскакивает через более высокий уровень JPane, например, JTextField просматривает JPanel, как вы можете видеть здесь:
[img]https://i.sstatic.net /GPnmjpEQ.png[/img]
Пока в моем коде нет ничего сложного в том, как я расположил слои. Я не возился с JLayeredPane, а лишь добавил JPanel и их соответствующие позиции макета:
majorPane.add(centerArea, BorderLayout.CENTER, 0);
majorPane.add(westArea, BorderLayout.WEST, 1);
majorPane.add(eastArea, BorderLayout.EAST, 2);
Поначалу, до того, как проблема возникла, я сначала не использовал JLayeredPane, и моя реализация представляла собой просто базовый BorderLayout, а затем расположение макетов JPanels. Проблема проявилась сама собой, когда я работал с CENTER и EAST JPanels в своей программе, и когда я уменьшал окно программы слева или справа, строки JTable (которые находились в JScrollPane) «просачивались» через EAST JPanel всякий раз, когда Я щелкнул пробелы в EAST JPanel. Проблема, по-видимому, разрешилась сама собой, когда я применил JLayeredPane и поместил в него обе JPanel, и на этот раз JScrollPane, содержащий JTable, фактически изменил свой размер соответствующим образом и не просачивался через панель EAST.
Однако добавление панели WEST снова возобновило проблему, и каждый раз, когда я уменьшал окно программы до стороны WEST JPanel, именно тогда кнопки и текстовые поля на этой JPanel просачивались через EAST JPanel. До сих пор организация иерархии слоев JPanels ничего не дала.
Я был бы признателен за любую информацию о том, почему это происходит или есть ли кто-то еще, кто это делает. Спасибо.
Вот пример кода того, как я это сделал:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class MinimalExample extends JFrame {
JPanel center, east, west, north, south;
JLayeredPane layeredPane;
JTable table;
JScrollPane scrollPane;
JTextField textField;
JComboBox one, two;
JButton button;
String[][] rows = new String[0][0];
String[] cols = { "Sample", "Sample", "Sample", "Sample", "Sample", "Sample" };
public MinimalExample() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500, 500);
setLayout(new BorderLayout());
layeredPane = new JLayeredPane();
layeredPane.setLayout(new BorderLayout());
north = new JPanel();
north.setLayout(new BorderLayout());
north.setBackground(Color.red);
north.setPreferredSize(new Dimension(100, 100));
add(north, BorderLayout.NORTH);
south = new JPanel();
south.setLayout(new BorderLayout());
south.setBackground(Color.red);
south.setPreferredSize(new Dimension(100, 100));
add(south, BorderLayout.SOUTH);
center = new JPanel();
center.setLayout(new BorderLayout());
center.setBackground(Color.PINK);
center.setSize(300, 300);
table = new JTable(rows, cols);
scrollPane = new JScrollPane(table);
center.add(scrollPane);
layeredPane.add(center, BorderLayout.CENTER, 0);
east = new JPanel();
east.setLayout(new FlowLayout());
east.setBackground(Color.GREEN);
east.setPreferredSize(new Dimension(200, 200));
button = new JButton("Click");
button.setPreferredSize(new Dimension(80, 50));
east.add(button);
layeredPane.add(east, BorderLayout.EAST, 1);
west = new JPanel();
west.setLayout(new FlowLayout());
west.setBackground(Color.CYAN);
west.setPreferredSize(new Dimension(210, 200));
textField = new JTextField();
textField.setPreferredSize(new Dimension(130, 30));
one = new JComboBox();
two = new JComboBox();
one.setPreferredSize(new Dimension(130, 30));
two.setPreferredSize(new Dimension(130, 30));
west.add(textField);
west.add(one);
west.add(two);
layeredPane.add(west, BorderLayout.WEST, 2);
add(layeredPane);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new MinimalExample();
});
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... her-jpanel
Мобильная версия