Office布局示例。 JLabel不会出现在JApplet中

时间:2013-08-01 20:38:35

标签: java swing jframe jpanel japplet

我已经彻底搜索(我认为)以解决我的问题。我是初学者,所以我可能只是不知道该找什么。我试图概述办公室布局(桌子,椅子),我用Graphics2D和GeneralPath编码,JLabels用每个椅子的名字。 如果这已经得到回答我道歉但我确实看了。 (注意:图形现在非常简单:桌子只是一个正方形而椅子只是线条。)

public class DemoReception扩展了JApplet {

@Override    
public void paint(Graphics g){
    //draws table
    Graphics2D g2 = (Graphics2D) g;
    g2.setStroke(new BasicStroke(4.0f));
    g2.setColor(Color.BLACK);

    int[] xPoints={150,700,700,150};
    int[] yPoints={250,250,550,550};
    GeneralPath path = new GeneralPath(GeneralPath.WIND_EVEN_ODD,xPoints.length);

    path.moveTo(xPoints[0], yPoints[0]);
    for (int i = 0; i < xPoints.length; i++) {
        path.lineTo(xPoints[i], yPoints[i]);
    }
    path.closePath();
    g2.draw(path);

    //draws chairs
    g2.setColor(Color.RED);
    path = new GeneralPath(GeneralPath.WIND_NON_ZERO);
    path.moveTo(260,240);//Person1
    path.lineTo(310,240);

    path.moveTo(510,240);//Person2
    path.lineTo(560,240);

    path.moveTo(260,560);//Person3
    path.lineTo(310,560);

    path.moveTo(510,560);//Person4
    path.lineTo(560,560);
    path.closePath();
    g2.draw(path);                               
   }

以下是主要方法:

   public static void main(String[] args) { 
    int labelwidth = 50;
    int labelheight = 10;

    JFrame testFrame = new JFrame("Test Layout");
    testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JApplet demo = new DemoReception();
    testFrame.setBackground(Color.white);
    testFrame.getContentPane().add(demo);
    testFrame.pack();
    testFrame.setMinimumSize(new Dimension(1000,710));
    testFrame.setSize(new Dimension(1000,710));

    JPanel testPanel = new JPanel();
    testPanel.setAlignmentX(0);
    testPanel.setAlignmentY(0);

    label1 = new JLabel("Person1");
    label2 = new JLabel("Person2");
    label3 = new JLabel("Person3");
    label4 = new JLabel("Person4");

    label1.setAlignmentX(260);
    label1.setAlignmentY(235);
    label1.setSize(labelwidth, labelheight);
    label1.setVisible(true);        
    testPanel.add(label1);

    label2.setAlignmentX(510);
    label2.setAlignmentY(235);
    label2.setSize(labelwidth, labelwidth);
    label2.setVisible(true);
    testPanel.add(label2);

    label3.setAlignmentX(260);
    label3.setAlignmentY(565);
    label3.setSize(labelwidth, labelwidth);
    label3.setVisible(true);
    testPanel.add(label3);

    label4.setAlignmentX(510);
    label4.setAlignmentY(565);
    label4.setSize(labelwidth, labelwidth);
    label4.setVisible(true);
    testPanel.add(label4);

    testFrame.getContentPane().add(testPanel);
    testFrame.setVisible(true);
}

当我运行它时,我得到的是带有图形的JFrame,但JLabel没有出现。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

JLabel JApplet未显示JFrame#pack,因为setVisible在添加所有标签之前调用testFrame.pack(); testFrame.setVisible(true); 。结果是这些组件未经过验证,因此不会出现

解决方案是在调用testFrame.getContentPane().add(testPanel);

之前调用该方法
JPanel

然而,必须进行进一步的更改,因为完成此操作后applet窗口本身不会出现。这是因为声明

testPanel

将导致testFrame.getContentPane().add(demo); BorderLayout移位,如前面的语句

中所实现的那样
CENTER

testPanel只能在JLabel位置包含一个组件。

要修复此问题,请移除JApplet并将demo组件直接添加到super.paint(g); paint

同时添加

JLabels

paint方法,以确保Swing绘制paintComponent


当然paint永远不应该用于Swing中的自定义绘制。而是使用JComponent

作为未来的练习,请务必使用基于paintComponent的课程替换super.paintComponent(g)功能,并覆盖{{1}}。请记得调用{{1}}。按照Performing Custom Painting

中列出的步骤操作