【问题标题】:JPanel doesn't show in BorderLayoutJPanel 不显示在 BorderLayout
【发布时间】:2011-12-06 12:00:53
【问题描述】:

我有一个边框布局,右边有一个 JPanel。 JPanel 具有绝对布局,它不包含任何内容,因为我正在使用它来绘制图形(覆盖 paintComponent(Graphics g))

问题是面板没有显示(它在那里,但像 1 像素宽)。我试图在面板上设置大小..但这不起作用..

我该怎么做?

frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
JPanel panelCenter = new JPanel();
panelRight = new ActorDrawer();
frame.getContentPane().add(panelRight, BorderLayout.EAST);
panelRight.setSize(200, 400);
panelRight.setLayout(null);
frame.getContentPane().add(panelCenter, BorderLayout.CENTER);
frame.getContentPane().add(panelBottom, BorderLayout.SOUTH);
table = new JTable(new MyTableModel());
JScrollPane scrollPane = new JScrollPane(table);
table.setFillsViewportHeight(true);
panelCenter.add(scrollPane);

【问题讨论】:

  • 永远不要使用空布局。

标签: java swing layout-manager


【解决方案1】:

查看 JPanel.setPreferredSize() 方法。另外,我认为 JFrame.setBounds() 调用不是您想要的。这是一个例子:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.BorderLayout;

public class Sandbox extends JFrame
{
    class MyPanel extends JPanel
    {
        public void paintComponent(Graphics g)
        {
            g.setColor(Color.RED);
            g.fillRect(0, 0, this.getWidth(), this.getHeight());
        }
    }

    public static void main(String[] args)
    {
        Sandbox s = new Sandbox();
    }

    public Sandbox()
    {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new BorderLayout());

        MyPanel panelRight = new MyPanel();
        panelRight.setPreferredSize(new Dimension(150, 300));
        this.getContentPane().add(panelRight, BorderLayout.EAST);

        JPanel panelCenter = new JPanel();
        this.getContentPane().add(panelCenter, BorderLayout.CENTER);

        JScrollPane scrollPane = new JScrollPane(new JTable());
        panelCenter.add(scrollPane);

        JPanel panelBottom = new JPanel();
        this.getContentPane().add(panelBottom, BorderLayout.SOUTH);

        this.setSize(400, 400);
        this.setVisible(true);
    }
}

【讨论】:

  • 否 - 永远不要调用任何 setXXSize 方法。相反,让组件返回合理的大小提示。 stackoverflow.com/questions/7229226/…
  • @kleopatra 在使用没有孩子的 JPanel 并直接在其中进行绘画时,我相信您必须执行 setXxxSize()...
  • @jfpoilpret 好点,尽管这是一个非常罕见的例外:大多数时候,绘图也具有“自然”大小。不会频繁到让我们的年轻同事感到困惑:-)
【解决方案2】:

BorderLayout 遵循东部组件的首选大小,并在必要时拉伸其高度。您是否尝试过设置面板的首选大小(或覆盖getPreferredSize 方法以返回您喜欢的大小)?

【讨论】:

    【解决方案3】:

    解决方案来了!!!我也在做同样的事情。

    JPanel panel = new JPanel();          
    JLabel strech_label = new JLabel("As long as you need ,  Dummy Text");
    strech_label.setPreferredSize( new Dimension( 111, 0 ) );
    
    panel.setLayout(new BorderLayout());
    
    panel.add(new MyDraw(), BorderLayout.CENTER);
    panel.add(strech_label, BorderLayout.SOUTH);
    
        frame1.setLayout(new BorderLayout());
        frame1.add(panel,BorderLayout.WEST);
    

    所以基本上 JLabel 要么位于南方,要么位于北方,它会有力地拉伸 MyDraw。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多