0

我是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);

    }

}
4

2 回答 2

2

我会先看看Performing Custom Painting

您的代码中的主要问题是NullPointerException当您单击按钮时您会得到,因为frameis的引用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一旦它在屏幕上可见,它将被调用以更新面板的状态......

您需要做的第一件事是为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);
}

您可能还想通读Java 编程语言的代码约定。这将使人们更容易阅读您的代码......

于 2013-11-13T03:13:44.020 回答
0

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

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

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

public void actionPerformed(ActionEvent event) {

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

    frame.repaint();

}

这会将您的自定义矩形绘图面板添加到BorderLayout. 如果要在按钮“顶部”添加矩形,则应将按钮嵌入 aJPanel中,然后将矩形绘图面板添加到该面板而不是主面板JFrame

于 2013-11-13T03:10:14.427 回答