我是初学者,在GUI上启动一个简单的项目。 RectangleComponent应该通过单击按钮在窗体上绘制一个Rectangle。矩形不会使用以下代码绘制,但如果我将相同的2行代码放在侦听器之外,它肯定有效。我将不胜感激任何帮助。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class EllipseRectViewer {
/**
* @param args
*/
public static void main(String[] args)
{
final JFrame frame = new JFrame();
final int FRAME_WIDTH = 400;
final int FRAME_HEIGHT = 400;
frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
frame.setTitle("Rectangle and Ellipse Draw");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
JPanel panel = new JPanel();
frame.add(panel, BorderLayout.NORTH);
class RectangleDrawListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
RectangleComponent r2 = new RectangleComponent();
frame.add(r2);
}
}
JButton rectButton = new JButton("Rectangle");
ActionListener rectDrawListener = new RectangleDrawListener();
rectButton.addActionListener(rectDrawListener);
panel.add(rectButton);
frame.setVisible(true);
}
}
import java.awt.Rectangle;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;
public class RectangleComponent extends JComponent
{
Rectangle rect;
public RectangleComponent()
{
rect = new Rectangle(20, 20, 30, 30);
}
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.draw(rect);
}
}
谢谢。
答案 0 :(得分:4)
将RectangleComponent添加到框架后,重新验证新添加的组件或框架的根窗格:
public void actionPerformed(ActionEvent event) {
RectangleComponent r2 = new RectangleComponent();
frame.add(r2);
// Option 1
r2.revalidate();
// Option 2
frame.getRootPane().revalidate();
}
注1:框架本身无法重新验证(最高JDK 1.6)
注2:框架本身可以重新验证(JDK 1.7 +)
答案 1 :(得分:3)
我认为你需要重新验证()框架。
frame.revalidate();
这样说:
public void actionPerformed(ActionEvent event)
{
RectangleComponent r2 = new RectangleComponent();
frame.add(r2);
frame.revalidate();
}
答案 2 :(得分:1)
尝试使用LineBorder。使用LineBorder创建JPanel并将JButton添加到JPanel。
答案 3 :(得分:1)
rect = new Rectangle(20,20,30,30);
第二个问题是您的组件没有首选大小。您的组件显示在一个简单的框架中,因为您将组件添加到BorderLayout的中心,因此忽略组件的首选大小。但是,如果在使用其他布局管理器时尝试使用该组件,则无法使用此功能。
您还应该覆盖getPreferredSize()方法,以便至少需要使用组件的首选大小:
return new Dimension(50, 50);
以适应彩绘矩形的大小和位置。