JComponents“弹出”其他 JPanel

问题描述 投票:0回答:1

我一直在尝试寻找与我的类似问题,但无济于事。

我有一个简单的 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);
    }
    
}
java user-interface layout window coding-style
1个回答
0
投票

我对你的代码做了一些更改,以避免“外观”,它可以改进,我希望它可以作为你的基础。

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() );
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.