Рисование прямоугольника кнопкой - PullRequest
3 голосов
/ 14 февраля 2012

Я новичок, начинающий простой проект на GUI. Компонент RectangleComponent должен рисовать прямоугольник на форме нажатием кнопки. Прямоугольник не будет рисоваться со следующим кодом, но если я помещу те же 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);
  } 
}

Спасибо.

Ответы [ 4 ]

4 голосов
/ 14 февраля 2012

После добавления 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 +)

3 голосов
/ 14 февраля 2012

я думаю, что вам нужно повторно проверить () фрейм.

frame.revalidate();

скажи это так:

public void actionPerformed(ActionEvent event)
{   
    RectangleComponent r2 = new RectangleComponent();
    frame.add(r2);
    frame.revalidate();
 }    
1 голос
/ 14 февраля 2012

rect = новый прямоугольник (20, 20, 30, 30);

Вторая проблема заключается в том, что ваш компонент не имеет предпочтительного размера. Ваш компонент отображается в простой рамке, потому что вы добавляете компонент в центр BorderLayout, поэтому предпочтительный размер компонента игнорируется. Однако это не будет работать, если вы попытаетесь использовать компонент при использовании других менеджеров компоновки.

Вам также следует переопределить метод getPreferredSize (), чтобы вернуть предпочтительный размер вашего компонента при минимуме, который вам необходимо использовать:

return new Dimension(50, 50);

для размещения размера и расположения нарисованного прямоугольника.

1 голос
/ 14 февраля 2012

Попробуйте использовать LineBorder. Создайте JPanel с LineBorder и добавьте JButton к JPanel.

...