4

所以在课堂上我们正在制作一个Java程序。我们正在尝试在 JFrame 中使用paint(Graphics g) 函数。我们在过去(几​​周前)尝试过它并且它曾经工作过。但现在它没有(或者我们在某个地方犯了错误)。我们也尝试过使用paintComponent(Graphics g),但似乎没有任何效果。这是我们的代码:

public class MainAc {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Class Paint");       
        JButton button = new JButton("Click for more");             
        frame.setSize(800, 600);    
        frame.add(button);
        frame.setLayout(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        button.setLayout(null);
        button.setLocation(100,100);
        button.setSize(200,100);
        frame.setVisible(true);     
    }
    public void paint(Graphics g){
        g.drawString("Hello", 200, 50);
    }
}
4

4 回答 4

12

你的课没有任何Component绘画能力

阅读“执行自定义绘画”以获得更多想法

您可以执行以下操作:

在此处输入图像描述

public class SimplePaint {

    public static void main(String[] args) {
        new SimplePaint();
    }

    public SimplePaint() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new PaintPane());
                frame.setSize(200, 200);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    protected class PaintPane extends JPanel {

        @Override
        protected void paintComponent(Graphics g) {

            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g.create();
            String text = "Look ma, no hands";
            FontMetrics fm = g2d.getFontMetrics();
            int x = (getWidth() - fm.stringWidth(text)) / 2;
            int y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent();
            g2d.drawString(text, x, y);
            g2d.dispose();


        }

    }

}

在可能的情况下,您应该避免覆盖顶级容器的paint方法,如果没有其他原因,它们不是双缓冲的。

出于同样的原因,您还应该尝试从基于 Swing 的组件进行扩展,因为混合使用重型和轻型组件可能会导致绘制问题。

于 2012-10-30T10:28:14.323 回答
5

所以你正在做的是paint在你自己的MainAc类中实现一个方法,而不是JFrame.

你的MainAc类本身,应该派生自JFrame.

下面的代码应该可以工作。如果你不理解继承,你应该查看你的课堂笔记,它会在那里。

public class MainAc extends JFrame {

    public static void main(String[] args) {
        new MainAc();
    }
    
    public MainAc() {
        super("Class Paint");       
        JButton button = new JButton("Click for more");             
        setSize(800, 600);    
        add(button);
        setLayout(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        button.setLayout(null);
        button.setLocation(100,100);
        button.setSize(200,100);
        setVisible(true);
    }
    
    public void paint(Graphics g) {
        super.paint(g);
        g.drawString("Hello", 200, 50);
    }
    
}
于 2012-10-30T10:26:15.290 回答
4

正如代码一样,您只是paint在类中定义一个方法。类扩展Object,所以你不是overridding在一个JComponent.

Component您的类必须扩展or的任何子类Component才能实际覆盖paintor paintComponent。在您的情况下,MainAc将扩展JFrame.

于 2012-10-30T10:26:18.423 回答
-1

这是一个似乎可以工作的 Sticky 代码的简化版本。我将其更改为扩展 JApplet 并使用该init()方法而不是main().

public class JavaApplication51 extends JApplet {
    public  void something() {
       JButton button = new JButton("Click for more");             
        add(button);
        setLayout(null);
        button.setLayout(null);
        button.setLocation(100,100);
        button.setSize(101,20);
        setVisible(true); 
    }

    public void paint(Graphics g) {
        super.paint(g);
        g.drawString("Hello", 200, 50);
    }

    public void init() {
        something();
    }
}
于 2015-02-21T07:24:48.033 回答