【问题标题】:Linking Together a JPanel and paintComponent将 JPanel 和paintComponent 链接在一起
【发布时间】:2012-11-22 17:32:38
【问题描述】:

如何让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;
    }
}
}

【问题讨论】:

    标签: java swing jpanel actionlistener paintcomponent


    【解决方案1】:

    JApplet 中没有 paintComponent 方法。

    你应该避免直接在像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;
                }
            }
        }
    }
    

    【讨论】:

    • 哇,直到现在才意识到paintComponent和JPanel的关系。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2023-03-11
    • 1970-01-01
    • 2021-04-14
    • 2017-03-10
    相关资源
    最近更新 更多