使用null布局将JPanels添加到JApplet中

4
我想在我的JApplet中添加4个JPanels,我为它们的每一个都设置了不同的颜色。但是没有任何颜色显示 - 我的意思是我看不到输出。没有任何颜色。以下代码位于init()方法中。
  this.setSize(1400, 780);
      this.setVisible(true);
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setLocationRelativeTo(null);
  this.setLayout(null) ; 

      setLayout(null) ; 

  Panel1 = new JPanel() ;
  Panel2 = new JPanel () ; 
  Panel3 = new JPanel() ; 
  Panel4 = new JPanel() ; 

  Label1 = new JLabel ("Label1") ; 
  Label2 = new JLabel ("Label2") ; 
  Label3 = new JLabel ("Label3") ; 
  Label4 = new JLabel ("Label4") ; 

  Panel1.add(Label1) ; 
  Panel2.add(Label2) ; 
  Panel3.add(Label3) ; 
  Panel4.add(Label4) ; 

  // Panel 1 "About Me"
  Panel1.setSize(140,390) ; 
  Panel1.setLocation(0,0) ; 
  Panel1.setBackground(Color.red) ; 
  Panel1.setVisible(true) ; 
  this.add(Panel1) ; 

  // Panel 2 "MyHoppies" 
  Panel2.setSize(140,390) ; 
  Panel2.setLocation(0,700) ; 
  Panel2.setBackground(Color.yellow) ;
  this.add(Panel2) ; 

  // Panel 3 "Photo Gallery"
  Panel3.setSize(140,390) ; 
  Panel3.setLocation(390,0) ; 
  Panel3.setBackground(Color.black) ;
  this.add(Panel3) ;

  // Panel 4 "Happey face" 
  Panel4.setSize(140,390) ;
  Panel4.setLocation(390,700) ; 
  Panel4.setBackground(Color.pink) ; 
  this.add(Panel4) ; 

1
可能是因为您一直在对Panel1应用setBackground(和setLocation)吗? - assylias
@assylias 考虑将此作为答案发布。 - Guillaume Polet
@GuillaumePolet 显然是个拼写错误。 - assylias
  1. this.setSize(1400, 780); 不要设置框架的大小,也不要扩展框架 - 只需使用一个实例。
  2. this.setVisible(true); 在添加组件并调用pack()之后再执行此操作。
  3. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 如果从小程序中调用此方法,将会出现问题 - 即使是受信任的小程序也不应显式关闭VM。
  4. this.setLocationRelativeTo(null); 使用setLocationByPlaftform(true)
  5. this.setLayout(null) ; 请参见mKorbel的答案。
  6. setLayout(null) ; 是的,JRE已经在第一次编写时听到了您的声音。
- Andrew Thompson
@AndrewThompson 你能告诉我3)的替代方案吗?有时候我会用WindowListener(如果我想在关闭应用程序之前保存一些内容),但在那里,我也调用System.exit(0); - brimborium
1
@brimborium JFrame.DISPOSE_ON_CLOSE就是这个问题的简短答案。在自定义操作完成后,调用frame.dispose(),虚拟机应该会自动退出。如果它无法退出,要么是applet仍在加载,要么是有另一个非守护线程在运行。更多细节,请参考Q&A网站。;) - Andrew Thompson
3个回答

6
  • this.setVisible(true)必须是GUI构造函数中的最后一行代码。

  • 正确使用Java命名约定,然后Panel1应该是panel1

  • 不要扩展JFrameJApplet,将其创建为局部变量,方式与Panel1相同。

  • 不要使用NullLayout,而应使用适当的LayoutManager,在这种情况下,可能是GridLayout,否则JFrames内容将无法随JFrame调整大小。

enter image description here

代码

import java.awt.*;
import javax.swing.*;

public class ColorongPanels {

    private JFrame frame = new JFrame("ColorongPanels");
    private JPanel panel1 = new JPanel();
    private JPanel panel2 = new JPanel();
    private JPanel panel3 = new JPanel();
    private JPanel panel4 = new JPanel();
    private JLabel label1 = new JLabel("Label1");
    private JLabel label2 = new JLabel("Label2");
    private JLabel label3 = new JLabel("Label3");
    private JLabel label4 = new JLabel("Label4");

    public ColorongPanels() {
        frame.setLayout(new GridLayout(2, 2, 5, 5));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel1.setBackground(Color.red);
        panel1.setLayout(new BorderLayout());
        panel1.add(label1, BorderLayout.CENTER);
        panel2.setBackground(Color.yellow);
        panel2.setLayout(new BorderLayout());
        panel2.add(label2, BorderLayout.CENTER);
        panel3.setBackground(Color.black);
        panel3.setLayout(new BorderLayout());
        panel3.add(label3, BorderLayout.CENTER);
        panel4.setBackground(Color.pink);
        panel4.setLayout(new BorderLayout());
        panel4.add(label4, BorderLayout.CENTER);
        frame.add(panel1);
        frame.add(panel2);
        frame.add(panel3);
        frame.add(panel4);
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ColorongPanels();
            }
        });
    }
}

1
@brimborium 因为如果不扩展其功能,就不应该扩展一个类。 - Guillaume Polet
1
不要继承JFrameJApplet。同意使用框架,但尝试制作一个不继承AppletJApplet的小程序吧 ;) - Andrew Thompson
@GuillaumePolet:你说得完全正确,谢谢。我以为你是一般地这么说的。;) - brimborium

3
你应该这样做:
panelx.setOpaque(true),然后它就会起作用。

谢谢,我看到一些带颜色的矩形,但它们没有填满它应该填满的空间。我想把窗口分成四个面板,每个面板都有不同的颜色。窗口的大小如我所指定的是(1400,700),然后每个面板应该有尺寸(400,390)宽度和高度。 - user1413188
请问您能否更新一下您的代码,这样我就能更好地理解了吗? - Joseph Elcid
如果您不需要面板用于其他用途,您可以创建一个JPanel / JLabel,覆盖public void paintComponents(Graphics g)方法以在其上绘制所需内容。通常不建议使用布局进行绘制,除非您想要填充JPanels与组件和其他内容。 - brimborium

2

首先:您需要使用JPanel.setOpaque(true)设置面板以查看背景颜色。

其次:不同平台上,背景颜色属性具有不同的效果。例如:如果您设置JButton的背景色,则在Win7中将看到按钮变色,但在WinXP中不会(不确定在其他操作系统下如何)。这至少是我的经验...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接