我一直在尝试寻找与我的类似问题,但无济于事。
我有一个简单的 Java 程序,其中有一个 JLayeredPane 和一个包含三个 JPanel 的 BorderLayout。在 JLayeredPane 内部,JPanel 排列为 WEST、CENTER、EAST。
当我在程序窗口上进行任何大小调整时,整个布局一开始会很好地调整大小,但是当我将其收缩直到到达 EAST 或 WEST 时,会出现 JComponent 穿过较高 JPane 层弹出的问题,就像 JTextField 透过JPanel 正如你可以在这里看到的:
到目前为止,在我的代码中,我如何安排图层并没有什么真正复杂的地方。我没有搞乱 JLayeredPane,只添加了 JPanel 及其各自的布局位置:
majorPane.add(centerArea, BorderLayout.CENTER, 0);
majorPane.add(westArea, BorderLayout.WEST, 1);
majorPane.add(eastArea, BorderLayout.EAST, 2);
首先,在问题出现之前,我一开始并没有使用任何 JLayeredPane,我的实现只是基本的 BorderLayout,然后是 JPanel 的布局位置。当我在程序中使用 CENTER 和 EAST JPanel 时,问题就显现出来了,当我沿左侧或右侧缩小程序窗口时,JTable(位于 JScrollPane 中)行将在 EAST JPanel 中“渗出”我单击了 EAST JPanel 中的空白处。当我应用 JLayeredPane 并将两个 JPanel 放入其中时,问题似乎自行解决了,这一次,包含 JTable 的 JScrollPane 实际上相应地调整了自身大小,并且没有渗透到 EAST 面板中。
但是,添加 WEST 面板会再次出现该问题,每次我将程序窗口缩小到 WEST JPanel 一侧时,JPanel 上的按钮和文本字段就会渗透到 EAST JPanel 中。到目前为止,安排 JPanel 的层次结构并没有起到任何作用。
任何关于为什么会发生这种情况的诊断,或者是否有其他人这样做,我将不胜感激。谢谢。
这是我如何做到这一点的示例代码:
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;
/**
*
* @author SAMPLE
*/
public class MinimalExample extends JFrame{
JPanel center, east, west,north,south;
JLayeredPane layeredPane;
JTable table;
JScrollPane scrollPane;
JTextField textField;
JComboBox<String> 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 MinimalExample() {
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setLayout( new BorderLayout() );
setFocusable( true );
setSize( 500, 500 );
north = new JPanel();
south = new JPanel();
center = new JPanel();
east = new JPanel();
west = new JPanel();
setPanel( north, Color.red, 0 );
setPanel( south, Color.red, 0 );
setPanel( center, Color.PINK, 0 );
setPanel( east, Color.GREEN, 1 );
setPanel( west, Color.CYAN, 1 );
north.setPreferredSize( new Dimension( 200, 100 ) );
south.setPreferredSize( new Dimension( 200, 100 ) );
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 ) );
button = new JButton( "Click" );
button.setPreferredSize( new Dimension( 80, 50 ) );
table = new JTable( rows, cols );
scrollPane = new JScrollPane( table );
east.add( button );
center.add( scrollPane );
west.add( textField );
west.add( one );
west.add( two );
add( north, BorderLayout.NORTH );
add( south, BorderLayout.SOUTH );
add( east, BorderLayout.EAST );
add( center, BorderLayout.CENTER );
add( west, BorderLayout.WEST );
setVisible( true );
}
private void setPanel( JPanel pan, Color col, int lay ) {
pan.setBackground( col );
pan.setMinimumSize( new Dimension( 200, 200 ) );
pan.setMaximumSize( new Dimension( 250, 250 ) );
pan.setPreferredSize( new Dimension( 200, 200 ) );
if( lay == 0 ) {
pan.setLayout( new BorderLayout() );
}
else {
pan.setLayout( new FlowLayout() );
}
}