在我调整大小之前,组件不会在 Applet 中显示

Posted

技术标签:

【中文标题】在我调整大小之前,组件不会在 Applet 中显示【英文标题】:Components aren't showing in Applet until I resize 【发布时间】:2012-02-04 06:13:57 【问题描述】:

我已经查看了此处的其他示例,但在创建所有组件之后是 revalidate() 或 repaint()。我也试过 this.setVisible(this);那没有用。我尝试在 createGUI() 方法中创建我的组件,并在 try/catch 语句中从 init() 方法运行它。

编辑 正如您在 cmets 中看到的那样,我尝试了所有示例。但是从每个人都说为什么这现在有效?

package basic;

import java.awt.*;
//import java.applet.*;
import java.applet.Applet;
import javax.swing.*;
import java.awt.event.*;

public class Shapes extends Applet implements ActionListener

JButton rectBtn = new JButton("Rectangle");
JButton circBtn = new JButton("Circle");
JLabel rectLbl = new JLabel("Rectangle"), circLbl = new JLabel("Circle");
JLabel widthLbl = new JLabel("Width"), heightLbl = new JLabel("Height");
JTextField widthTF = new JTextField(6), heightTF = new JTextField(6), colorTF;

boolean rectOn;
boolean circOn;
int x,y, width, height;
String xcord, ycord, widthSize, heightSize;

public void init()
   

    JPanel TotalGUI = new JPanel(new GridLayout(2,0));
    TotalGUI.add(rectLbl);      TotalGUI.add(rectBtn);
        rectBtn.addActionListener(this);
    TotalGUI.add(circLbl);      TotalGUI.add(circBtn);
        circBtn.addActionListener(this);
    TotalGUI.add(widthLbl);     TotalGUI.add(widthTF);
    TotalGUI.add(heightLbl);    TotalGUI.add(heightTF);
    add(TotalGUI, BorderLayout.WEST);
    //this.setVisible(true);
    TotalGUI.repaint();
    //pack();



//@Override
public void paintComponent(Graphics g)

    //super.paintComponent(g);
    //Graphics g2 = getGraphics();

    if(rectOn)//if Rectangle has been pressed
    
        g.drawRect(x,y, width,height);
    
    if(circOn)//if Circle has been pressed
    
        g.drawOval(x,y, width, height);
    


public void actionPerformed(ActionEvent e)

    if(e.getSource() == rectBtn)
    
        rectOn = true;
    
    if(e.getSource() == circBtn)
    
        circOn = true;
    
    //Reads coordinates and sizes as Strings and converts to integers
    try
        widthSize = widthTF.getText();
        width = Integer.parseInt(widthSize);    
        heightSize = heightTF.getText();
        height = Integer.parseInt(heightSize);
    
    catch(Exception err)     JOptionPane.showMessageDialog(null, "Enter a number!");   
    repaint();

感谢您的帮助!

【问题讨论】:

如需尽快获得更好的帮助,请发帖 SSCCE。但在此之前,请删除 Graphics g = getGraphics(); 并将所有对 g 的引用替换为 g2。您还不会看到组件,但它可能会停止闪烁。 我发布了代码,并删除了图形 g = getGraphics();不幸的是,这对闪烁没有帮助。 【参考方案1】:

原始代码的主要问题是您在没有调用 super.paint(g) 的情况下覆盖了 paint() 方法。当您将该方法更改为 paintComponent() 时,代码会起作用,因为该方法甚至不会在 Applet 中退出,因此它是死代码。

你的代码的问题:

    您应该为 Swing 小程序扩展 JApplet 您不应覆盖 Applet 的 paint()(或 paintComponent())方法。如果您需要进行自定义绘制,则覆盖 JPanel(或 JComponent)的 paintComponent() 方法并将面板添加到小程序的内容窗格中。 代码应在 EDT 上执行。 小程序会自动显示组件,无需调用repaint) 切勿使用 getGraphics() 进行自定义绘制。使用 paintComponent() 方法的 Graphics 对象。 当您尝试重写方法时,请不要忘记在方法签名之前使用@Override 注释,以确保您正确地重写了该方法。

首先阅读Swing tutorial 以获得更好的解释和工作示例。从以下部分开始:

    如何制作小程序 执行自定义绘画

【讨论】:

1->正确 2->正确。没有人提出其他建议:) 5-> 是的。 6->不相关,但始终有效 我查找了 Applet 与 JApplet 以及一些论坛,它确实建议使用 Applet,尽管它是旧方式。我将程序更改为使用 JApplet,但一切都消失了,所以我选择坚持使用 Applet。数字 3 是什么意思,在 EDT 上执行? 建议使用Applet 和Swing 组件的论坛是错误的!如果您的代码不适用于 JApplet,那么您的代码无效。这就是为什么我列出了您的代码的所有潜在问题。 EDT 代表事件调度线程,在“并发”部分中进行了描述。在“如何制作小程序”的教程中也给出了如何使用 EDT 的正确示例,其中代码使用 invokeAndWait【参考方案2】:

你应该在 TotalGUI 上调用 repaint()。

调整大小后您的 gui 刷新的原因是调整大小会自动为您调用 repaint()。但是,如果您希望您的 gui 更改立即出现,您应该调用 repaint();

但是,一种首选方法是在您的 totalGUI 的 paint(Graphics g)/paintComponent(Graphics g) 方法/s 中使用:

super.paintComponent(g);

如这些帖子所述:

JPanel repaint issue

http://www.sitepoint.com/forums/showthread.php?273522-super.paintComponent()

【讨论】:

也许我把 repaint() 放在了错误的地方,因为那仍然不起作用。我将其称为 init 方法中的最后一件事。我会试试 super.paintComponent(g) 方法,看看效果如何,谢谢 :) -1 无需调用 repaint()。小程序将执行此操作。您也永远不会覆盖 Applet 的 paintComponent() 方法,因为该方法不存在。 @camickr TotalGUI 是 JPanel,而不是小程序。 JPanel 是一个组件,因此具有paintComponent 方法。 此处发布的代码完全包含在扩展的 Applet 类中。没有理由重写 TotalGUI 类的 paintComponent() 方法,因为代码只是向其中添加组件。我现在明白你在哪里试图提出建议,但建议并不清楚。正如您从海报更新的代码中看到的那样,他只是将paint() 方法更改为paintComponent() 方法。此外,您不应该建议重写paint() 方法,因为自定义绘画是在JPanel 的paintComponent() 方法中完成的。

以上是关于在我调整大小之前,组件不会在 Applet 中显示的主要内容,如果未能解决你的问题,请参考以下文章

在 chrome 中调整窗口大小之前,字体不会显示

我的 JComponent 的内容仅在手动调整大小后刷新

除非调整窗口大小,否则组件不会显示 - Java

根视图控制器内置在代码中 - 不会为 iPad 调整大小

在调整浏览器窗口大小之前,背景图像不会显示在动画 div 上

有啥方法可以在我的 Java 游戏上调整我的组件大小?