在我调整大小之前,组件不会在 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 中显示的主要内容,如果未能解决你的问题,请参考以下文章