【问题标题】:JPanel didn't show rest of it's componentJPanel 没有显示其余的组件
【发布时间】:2012-09-08 09:35:32
【问题描述】:

我有一个带有按钮的框架和一个JPanel,正如我命名的面板一样,我希望在单击按钮后向我的面板添加一个内部面板。但这可是有问题的!因为在添加第二个面板后它没有添加任何其他面板。

代码

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.GridLayout;
import javax.swing.JTextField;


public class DrawImages extends JFrame{
    
    int i;
    public DrawImages() {
        JButton btnNewButton = new JButton("New button");
        i = 0;
        getContentPane().add(btnNewButton, BorderLayout.SOUTH);
        setMinimumSize(new Dimension(1000,150));
        final JPanel panel = new JPanel();
        panel.setSize(995, 145);
        getContentPane().add(panel, BorderLayout.CENTER);
        panel.setLayout(null);
        

        final JLabel lblNewLabel = new JLabel("New label");
        lblNewLabel.setBounds(0, 0, 46, 14);
        panel.add(lblNewLabel);
        
        btnNewButton.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent paramActionEvent) {
                JPanel panel_1 = new JPanel();
                //getContentPane().add(panel_1, BorderLayout.NORTH);
                panel_1.setLayout(null);
                JLabel imagelable = new JLabel(new ImageIcon("c:\\good.jpg"));
                imagelable.setBounds(70, 5, 105, 65);
                panel_1.add(imagelable);
                
                JLabel lblNewLabel_4 = new JLabel("Up Label");
                lblNewLabel_4.setBounds(5, 5, 65, 35);
                panel_1.add(lblNewLabel_4);
                
                JLabel lblNewLabel_2 = new JLabel("Down Label");
                lblNewLabel_2.setBounds(5, 25, 65, 65);
                panel_1.add(lblNewLabel_2);
                lblNewLabel.setText(""+i);
                panel_1.setBounds(5+170*i, 5, 170+170*i, 70);
                panel.add(panel_1);
                i++;
            }
        });
        panel.setMinimumSize(new Dimension(995,150));
    }

    public static void main(String[]args)
    {
        DrawImages drawImages = new DrawImages();
        drawImages.setVisible(true);
    }
}

【问题讨论】:

  • 我怀疑你需要在整个框架的父面板上调用repaint,视情况而定。
  • @DuncanJones 它适用于 2 个第一个按钮单击而无需重新绘制!这真的能解决问题吗?
  • setLayout(null); 问题就从这里开始......你想显示一组图像吗?
  • 是的,我想显示一组图像并根据需要将它们放在面板中,因此我不需要绑定,为此我使用 setLayout(null)。这没有错!

标签: java swing jpanel layout-manager null-layout-manager


【解决方案1】:

问题出在语句上:

panel_1.setLayout(null);

panel_1 没有任何首选大小,因此不会出现(或显示为一个小点)。

Swing 旨在使用布局管理器。在这种特殊情况下,您可以使用 GridLayout

阅读:Doing Without a Layout Manager

【讨论】:

  • 我目前正在使用 setlayout(null) 并且效果很好!如果程序员可以控制他/她的 Jframe 组件位置,那就没有错!
  • 当然可以,但布局管理器确实使这项任务变得更容易。见附加链接。
【解决方案2】:

我同意 Reimeus 的观点。只是为了测试您的代码,我使用了

panel_1.setLayout(new FlowLayout());

我可以看到面板被添加而无需在父面板上调用 repaint()。

【讨论】:

    【解决方案3】:

    感谢您的回答,但我的问题是我在每个圈子中添加了第三个参数:

    panel_1.setBounds(5+170*i, 5, 170+170*i, 70);
    

    所以我的面板越来越大(事件比我的显示器大)所以正确的是:

    panel_1.setBounds(5+170*i, 5, 170, 70);
    

    【讨论】:

      猜你喜欢
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多