有人可以帮我理解为什么我的自定义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);
    }
}

最佳答案

您要在组件树中的几个不同位置添加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()

(对同一组件事物的多个引用仍然适用)

09-11 17:47
查看更多