单击按钮,获得绘制矩形

时间:2013-11-13 03:06:57

标签: java swing

我是Java的新手....我研究过我们可以在框架上添加两个东西...我添加了按钮,并通过点击按钮我想要矩形作为输出....但我不明白那..为什么我没有得到输出.....

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class customizedgui5 implements ActionListener {

    JButton button;

    JFrame frame;

    public static void main(String[] args) {

        customizedgui5 hi = new customizedgui5();

        hi.go();
    }

    public void go() {

        JFrame frame = new JFrame();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton button = new JButton("click me");

        button.addActionListener(this);

        myclass a = new myclass();

        frame.getContentPane().add(button, BorderLayout.CENTER);

        frame.getContentPane().add(a, BorderLayout.SOUTH);

        frame.setSize(100, 100);

        frame.setVisible(true);

    }

    public void actionPerformed(ActionEvent event) {

        frame.repaint();

        frame.revalidate();

    }

}

class myclass extends JPanel {

    public void paintComponent(Graphics g) {

        g.setColor(Color.orange);

        g.fillRect(20, 50, 100, 100);

    }

}

2 个答案:

答案 0 :(得分:2)

我首先来看看Performing Custom Painting

代码中的主要问题是,当您点击该按钮时,您获得NullPointerException,因为frame的引用为null

它是null因为你在构造函数中隐藏了它(基本上,在构造函数中声明了同名的另一个变量)...

// I'm null..
JFrame frame;

public void go() {
    // Not the same as frame above...
    JFrame frame = new JFrame();

由于多种原因,您也不会看到任何变化......

  1. myclass面板没有尺寸。对于BorderLayout,这不会是“太多”问题,但是......
  2. 您已在面板的可见范围之外绘图。您正在绘制的矩形将不会显示,因为它是在面板的宽度和高度之外绘制的。
  3. 在您按下按钮之前将出现矩形,因为在屏幕上显示面板后,将调用paintComponent来更新面板的状态...
  4. 您需要做的第一件事就是为BorderLayout提供某种尺寸提示。尝试添加...

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

    myclass

    您也不需要重新绘制框架,您真正要重绘的是myclass的实例。尝试更新customizedgui5,以便a成为实例变量(例如frame ...

    //...
    myclass a;
    //...
    
    public void go() {
    
        //...
        a = new myclass();
        //...
    
    }
    
    public void actionPerformed(ActionEvent event) {
        a.repaint();
    }
    

    现在,当面板在屏幕上可见时,仍会显示矩形。当然你可以尝试将它设置为不可见,但这将影响框架的布局,隐藏你的组件开始,所以,相反,我们需要一些我们可以跳闸的标志,所以我们知道何时绘制矩形。这可以通过使用简单的boolean变量轻松实现,例如......

    class myclass extends JPanel {
    
        private boolean paintRect;
    
        public void setPaintRect(boolean paint) {
            paintRect = paint;
            repaint();
        }
    
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(120, 150);
        }
    
        @Override
        public void paintComponent(Graphics g) {
    
            super.paintComponent(g);
    
            if (paintRect) {
                g.setColor(Color.orange);
                g.fillRect(20, 50, 100, 100);
            }
    
        }
    }
    

    然后在你actionPerformed方法中,你只需要设置标志......

    public void actionPerformed(ActionEvent event) {
        a.setPaintRect(true);
    }
    

    您可能还想阅读Code Conventions for the Java Programming Language。这将使人们更容易阅读您的代码...

答案 1 :(得分:0)

当您点击按钮时,您正在调用方法actionPerformed(ActionEvent event)

看看你在那里做了什么。目前,您重新绘制并重新验证框架。如果要在框架中添加矩形,则需要在绘制矩形的框架中添加新组件。

您可以添加myclass JPanel的另一个实例,其中绘制一个矩形,如下所示:

public void actionPerformed(ActionEvent event) {

    frame.getContentPane().add(new myclass(), BorderLayout.NORTH);

    frame.repaint();

}

这会将您的自定义矩形绘图面板添加到BorderLayout的北部。如果您想在按钮上添加矩形,则应将按钮嵌入JPanel,然后将矩形绘图面板添加到其中而不是主JFrame