1

如何让paintComponent 在我的drawArea JPanel 中工作?此外,我设置 drawArea 尺寸的尝试失败了。运行后不会进行绘图,并且 JPanel 是最小尺寸。这与 MigLayout 有关系吗?

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;

public int number;

//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);

    JPanel drawArea = new JPanel();
    drawArea.setSize(400, 400);
    drawArea.setBorder(BorderFactory.createTitledBorder("Draw Area"));
    add(drawArea, "span 2");

    setSize(WIDTH, HEIGHT);
}

//Event Handler
public class NumHandler implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        number = Integer.parseInt(numberTF.getText());
        repaint();
    }

}

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

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

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

1 回答 1

2

中没有paintComponent方法JApplet

您应该避免直接在顶级容器上绘画,例如JApplet,它只是一个单层容器。

相反,创建第二个类,从某些东西扩展JPanel并在那里执行您的自定义绘画。

更新

您还应该避免使用setPreferred/Minimum/MaximumSize,它很容易被其他人规避。

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;
    public int number;

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

        JPanel header = new JPanel();
        header.add(numberL);
        header.add(numberTF);

        add(header, BorderLayout.NORTH);
        add(new PaintPane());

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

//        JPanel drawArea = new JPanel();
//        drawArea.setSize(400, 400);
//        drawArea.setBorder(BorderFactory.createTitledBorder("Draw Area"));
//        add(drawArea, "span 2");

        setSize(WIDTH, HEIGHT);
    }

    //Event Handler
    public class NumHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            number = Integer.parseInt(numberTF.getText());
            repaint();
        }
    }

    //Draw Ovals
    public class PaintPane extends JPanel {

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            int x = 10;
            int y = 10;
            int width = 200;
            int height = 100;

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

                x += 5;
                y += 5;
                width += 5;
                height += 5;
            }
        }
    }
}
于 2012-12-04T23:51:44.763 回答