JFrame和Rectangle

时间:2014-01-23 03:04:53

标签: java swing jframe paint

有人能告诉我为什么矩形没有出现在画面上吗?

我只在框架上看到一个按钮。请帮忙。

我尝试使用paint方法绘制矩形。

我应该使用paintComponent()还是只使用paint()

public class GUI2 {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Game");
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        frame.setLocation(500, 200);
        JPanel panel = new JPanel();
        frame.add(panel);
        JButton button = new JButton("YO");
        panel.add(button);
        button.addActionListener(new Action());
        frame.paint(null);
    }

    public void paint(Graphics g) {
        g.drawRect(250, 250, 200, 100);
    }

    static class Action implements ActionListener {

        public void actionPerformed(ActionEvent e) {

        }
    }
}

3 个答案:

答案 0 :(得分:4)

  1. 您不必明确致电paint
  2. 摆脱paint方法
  3. 制作内部JPanel课程
  4. paintComponent班级
  5. 中覆盖JPanel
  6. 使用super.paintComponent方法调用paintComponent
  7. 将课程JPanel添加到JFrame
  8. 不要在main内部执行任何操作,因为您会发现static会导致问题。在构造函数中执行所有操作
  9. 从EDT SwingUtilitites.invokeLater()运行该程序。
  10. 使按钮成为全局变量,以便可以从ActionListener
  11. 访问该按钮 添加完所有组件后,
  12. setVisible应该是你做的最后一件事。
  13. JFrame添加多个组件时,您需要使用BorderLayout位置,或将布局设置为JFrameBorderLayout以外的其他内容
  14. 在绘制时覆盖getPrefferedSize中的JPanel,因此JPanel具有受尊重的首选尺寸。
  15. 请勿设置JFrame只调用pack();
  16. 的大小

    以下是代码的重构

    另见Creating GUI with Swing | Graphics2D | Performing Custom Paintin了解更多详情。

    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    
    public class GUI2 {
    
        JButton button = new JButton("YO");
    
        public GUI2() {
            button.addActionListener(new Action());
            JFrame frame = new JFrame("Game");
            frame.add(new DrawPanel(), BorderLayout.CENTER);
            frame.add(button, BorderLayout.SOUTH);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        private class DrawPanel extends JPanel {
    
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawRect(250, 250, 200, 100);
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 400);
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new GUI2();
                }
            });
        }
    
        static class Action implements ActionListener {
    
            public void actionPerformed(ActionEvent e) {
    
            }
        }
    }
    

答案 1 :(得分:2)

我可以告诉你为什么你会得到NullPointerException

  1. 您没有覆盖任何可显示组件的任何绘制方法
  2. 您没有向Graphics方法传递有效paint上下文,但我会以任何方式阻止此
  3. 您应该使用@Override注释,这会阻止该类编译。当你认为你正在覆盖父类的方法时会使用它,它会告诉你什么时候出错
  4. 首先看一下Performing Custom Painting,然后看一下Painting in AWT and Swing,了解有关如何在Swing中实际绘画的详细信息

答案 2 :(得分:0)

以下是您的代码的工作示例:

   package test;

import javax.*;
import javax.swing.*;

import java.awt.event.*;
import java.awt.image.ImageObserver;
import java.awt.*;
import java.text.AttributedCharacterIterator;

public class GUI2 extends JPanel{
    JButton button;
    JFrame frame;

    public GUI2() {
        button = new JButton("YO");
        //panel = new JPanel();
        frame = new JFrame();
        //panel = new JPanel();
        this.add(button);
        frame.add(this);
        //button.addActionListener(new Action());
        // this.paint(null);
        frame.setSize(500, 500);
        frame.setLocation(500, 200);
        frame.setVisible(true);
    }

    public void paint(Graphics g) {
        g.setColor(Color.red);
        g.drawRect(250, 250, 200, 100);
    }
public static void main(String[] args) {

        GUI2 test = new GUI2();
    }
}

我删除了一些语句,但您可以稍后添加