【问题标题】:Office layout example. JLabels don't show up in JApplet办公室布局示例。 JLabels 不显示在 JApplet 中
【发布时间】:2013-08-01 20:38:35
【问题描述】:

我已经彻底搜索(我认为)我的问题的答案。我是初学者,所以我可能只是不知道要寻找什么。我正在尝试概述办公室布局(桌子、椅子),我使用 Graphics2D 和 GeneralPath 以及每把椅子命名的 JLabels 对其进行编码。 如果这已经得到回答,我很抱歉,但我确实看过。 (注意:现在的图形非常简单:桌子只是一个正方形,椅子只是线条。)

公共类 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,但没有显示 JLabels。 任何帮助将不胜感激。

【问题讨论】:

  • 你的paint方法需要调用super.paint(g)吗?在我的脑海中,看起来您的 paint() 覆盖将绘制图形,但它不会绘制任何其他内容。它不会自动执行覆盖版本所做的其余工作。你需要自己调用 super.paint(g) 来完成。看看这是否有效。
  • P.S.我在这里看到了其他建议覆盖 paintComponent() 而不是 paint() 的答案......对不起,我不知道这是否是你需要的。如果你这样做,同样适用——你必须让它调用 super.paintComponent(g)。

标签: java swing jframe jpanel japplet


【解决方案1】:

JLabel 不会出现在 JApplet 中,因为在添加所有标签之前调用了 JFrame#pack。结果是那些组件没有经过验证所以不出现

解决方法是在调用setVisible之前调用方法

testFrame.pack();
testFrame.setVisible(true);

但是,需要进行进一步的更改,因为完成此操作后,小程序窗口本身不会出现。这是因为声明

testFrame.getContentPane().add(testPanel);

将导致JPanel testPanel 被替换,如前面的语句中实现的那样

testFrame.getContentPane().add(demo); 

BorderLayoutCENTER 位置只能包含一个组件。

要解决此问题,请移除 testPanel 并将 JLabel 组件直接添加到 JApplet demo

同时添加

super.paint(g);

paint 方法以确保JLabels 是由Swing 绘制的。


当然,paint 绝对不能用于 Swing 中的自定义绘画。而是使用paintComponent

作为未来的练习,请确保使用基于JComponent 的类替换paint 功能并覆盖paintComponent。记得调用super.paintComponent(g)。按照Performing Custom Painting中列出的步骤进行操作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    相关资源
    最近更新 更多