【问题标题】:Custom JComponent only Displays on JFrame not JPanel自定义 JComponent 仅显示在 JFrame 而非 JPanel 上
【发布时间】:2012-02-01 22:46:27
【问题描述】:

有人可以帮我理解为什么我的自定义 JComponent 'Bar' 仅在直接添加到 JFrame 时显示,而不是在添加到 JPanel(然后添加到 JFrame)时显示?

谢谢!

package main;

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Board {

    public void start(){
        JFrame frame = new JFrame();
        JButton button1 = new JButton("Button 1");
        Bar statusbar = new Bar();
        JLabel status = new JLabel("Status: ");

        JPanel topPanel = new JPanel();
        topPanel.add(status);
        topPanel.add(statusbar);

        JPanel mainPanel = new JPanel();
        mainPanel.add(button1);
        mainPanel.add(statusbar);

        frame.getContentPane().add(BorderLayout.NORTH, topPanel);
        frame.getContentPane().add(BorderLayout.SOUTH, mainPanel);
        frame.getContentPane().add(BorderLayout.CENTER, statusbar);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200,100);
        frame.setVisible(true);
    }
}

这是我的酒吧课...

package main;

import java.awt.Graphics;

import javax.swing.JComponent;

public class Bar extends JComponent{
    public void paint(Graphics g){
        g.fillRect(0, 0, 100, 10);
    }
}

【问题讨论】:

    标签: java swing jpanel jcomponent


    【解决方案1】:

    您将statusbar 添加到组件树中的几个不同位置,Swing 不能很好地处理(或根本没有)。

    每次使用时创建一个单独的Bar实例,如果你想让它们的显示同步,它们应该共享同一个模型。

    编辑

    啊,再看一眼,这里的问题是您从未为 Bar 组件设置大小(或首选大小),因此它们被布局管理器压缩为 0。

    试试:

    public static class Bar extends JComponent {
    
        private Bar() {
            setPreferredSize(new Dimension(25, 5));
        }
    
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.fillRect(0, 0, 100, 10);
        }
    }
    

    您还应该在显示之前添加frame.pack()

    (对同一个组件的多次引用也是如此)

    【讨论】:

      【解决方案2】:

      自定义组件的维度为(0, 0)

      当添加到具有BorderLayout 布局管理器的容器时,它将扩展以填充可用空间,因此变得可见。

      当添加到具有FlowLayout 布局管理器的容器时,它不会扩展,而是保持其首选大小(即(0, 0))。因此,不会变得可见,尽管它仍然存在。

      这解释了为什么自定义组件仅在直接添加到JFrame 时才会显示,因为它使用BorderLayout 布局管理器,而JPanel 使用FlowLayout 布局管理器。

      【讨论】:

      • 非常感谢您的回复,我对 Java 还是很陌生,您会如何建议我为我的 Bar 组件设置一个维度,以便它可以按“要求的”大小显示?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      相关资源
      最近更新 更多