我是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);
}
}
答案 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();
由于多种原因,您也不会看到任何变化......
myclass
面板没有尺寸。对于BorderLayout
,这不会是“太多”问题,但是...... 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);
}
您可能还想阅读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