【问题标题】:Drawing with paintComponent in Applet Upon Event事件发生时在 Applet 中使用paintComponent 进行绘图
【发布时间】:2012-12-04 16:55:46
【问题描述】:

我正在尝试创建一个小程序,它将产生与文本框中指定的数字一样多的椭圆。出现文本框,但按回车后,我的paintComponent 不绘制。提前谢谢你。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import net.miginfocom.layout.*;
import net.miginfocom.swing.MigLayout;
import java.awt.geom.*;

public class OvalDrawer extends JApplet
{
private JLabel numberL;
private JTextField numberTF;

private NumHandler numHandler;

public static final int WIDTH = 500;
public static final int HEIGHT = 500;

//Create Layout
public void init()
{
    setLayout(new MigLayout("wrap 2"));
    numberL = new JLabel("Enter number of ovals to draw:");
    numberTF = new JTextField(7);

    add(numberL);
    add(numberTF);

    numHandler = new NumHandler();
    numberTF.addActionListener(numHandler);

    setSize(500, 500);
}

//Event Handler
public class NumHandler implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        repaint();
    }

}

//Draw Ovals
public void paintComponent (Graphics g)
{
    super.paintComponents(g);
    int number;
    int x = 10;
    int y = 30;
    int width = 20;
    int height = 10;

    number = Integer.parseInt(numberTF.getText());

    for (int i = 0; i < number; i++)
    {
        g.drawOval(x, y, width, height);

        x += 5;
        y += 5;
        width += 5;
        height += 5;
    }
}
}

【问题讨论】:

    标签: java swing user-interface paintcomponent


    【解决方案1】:

    JApplet 类没有要覆盖的paintComponent 方法。请注意,您的编译器不会让您调用实际的超级方法(您认为您可能正在这样做,但您实际上是在调用 super.paintComponents(...),一个完全不同的方法)。

    一个不好的解决方案是覆盖 JApplet 的绘制方法,但我强烈建议您不要这样做。相反,您应该在 JPanel 的 paintComponent 方法中进行绘制,然后让 JApplet 显示该 JPanel。此外,您需要养成使用 @Override 注释的习惯,以确保您实际上覆盖了您认为的方法。

    【讨论】:

    • 这是有道理的。我添加了一个JPanel。如何在 JPanel 中绘画?
    • @NathanSacket:请看这里:Lesson: Performing Custom Painting
    • 这很有用,但不解释如何在 MigLayout 内的 JPanel 内绘图。我正在用关于该主题的其他文章来补充这个问题,但我无法完成。
    • @NathanSacket:布局与绘图无关,不会影响。如果您担心显示背景图像,那么您需要专注于覆盖组件的不透明性,而不是布局。
    • 我可能需要提出一个新问题。对于所提出的问题,这是一个了不起的答案。谢谢。
    【解决方案2】:
    /*  * <Applet code=PressButton2 width=600 height=600>  * </Applet> 
    */
    
    import javax.swing.*; import java.awt.*; import java.awt.event.*;
    
    
    class MyPanel extends JPanel {
        static String s="n";
    
        public void paintComponent(Graphics g)  { 
            super.paintComponent(g);
    
            if(s.equals("g"))
                setBackground(Color.green);
            if(s.equals("b"))
                setBackground(Color.blue);
            if(s.equals("c"))
                setBackground(Color.white);
         }
    }
    
    public class PressButton2 extends JApplet {
        MyPanel panel;
        MyPanel screen;
        String s="n";
    
        JButton green, clear, blue;
    
        public void init() {
            Container container = getContentPane();
            panel = new MyPanel();
            screen = new MyPanel();
            panel.setLayout(new GridLayout(1, 3));
    
            green = new JButton("Green");
            blue = new JButton("Blue");
            clear = new JButton("Clear");
            green.addActionListener(new ActionEventHandler1());
            blue.addActionListener(new ActionEventHandler1());
            clear.addActionListener(new ActionEventHandler1());
    
            panel.add(green);
            panel.add(blue);
            panel.add(clear);
    
            container.add(panel, BorderLayout.SOUTH);
            container.add(screen);
        }
    
    class ActionEventHandler1 implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String temp = e.getActionCommand(); 
    
            if (temp.equals("Green")) {
                MyPanel.s = "g";
    
                screen.repaint();
            }
            if (temp.equals("Blue")) {
                MyPanel.s = "b";
                screen.repaint();
            }
            if (temp.equals("Clear")) {
                MyPanel.s = "c";
                screen.repaint();
            }
        }
    }
    

    【讨论】:

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