2016-03-05 5 views
0

Цель моего кода - создать прямоугольник при нажатии кнопки. Кнопка работает нормально, но сам прямоугольник не отображается на экране, и ошибок нет. Спасибо за помощь.Java-приложение, создающее Rectangle при нажатии кнопки

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class Tester { 

static JButton button; 
static JFrame frame; 
static JPanel panel; 
static Rectangle rec; 

static void init(){ 
    button = new JButton(); 
    frame = new JFrame(); 
    panel = new JPanel(); 
    rec = new Rectangle(30,30,30,30); 

    button.setVisible(true); 
    panel.add(button); 
    frame.add(panel); 
    frame.setVisible(true); 
    panel.setVisible(true); 
    frame.setSize(200, 200); 
    button.setBackground(Color.GREEN); 
    button.setBounds(30, 30, 20, 20); 

} 

public static void main(String[] args) { 
    init(); 
    ActionListener listener = new RectangleMover(); 
    button.addActionListener(listener); 
} 

static class RectangleMover implements ActionListener{ 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     RectanglePainter r = new RectanglePainter(); 
     r.add(rec); 
    } 

} 

static class RectanglePainter extends JPanel{ 

    void add(Rectangle r){ 
    rec = r; 
    repaint(); 
    } 

    protected void paintComponent(Graphics g){ 
     Graphics2D g2 = (Graphics2D) g; 
     Random r = new Random(); 
     int i =r.nextInt(2); 
     if (i==1) 
     g2.setColor(Color.BLUE); 
     else 
     g2.setColor(Color.RED); 
     g2.fill(rec); 
     g2.draw(rec); 
    } 

} 

} 
+0

Хорошо, ваш обычно подход не рекомендуется использовать 'JComponent' как« форму », вы должны добавлять фигуры в' JComponent', которые нарисованы с помощью метода 'paintComponent' – MadProgrammer

+0

Привет, я не совсем понимаю, как я использую JComponent как форма. Как бы вы порекомендовали меня изменить код, чтобы не использовать его как форму, но добавлять к нему фигуры? –

+0

Итак, каждый раз, когда вы нажимаете кнопку, вы создаете новый экземпляр «ShapeChanger», который является компонентом. Хотя вы можете это сделать, вы игнорируете тот факт, что менеджер макета ('BorderLayout' в этом случае) в любом случае не выложит его. Лучшим решением было бы сделать один компонент, который может рисовать несколько фигур, как показано в моем ответе – MadProgrammer

ответ

1

Ваши обычно подход слегка искажен, а не с помощью другого JComponent «действовать» как форма, вы должны использовать его, чтобы нарисовать все фигуры через этот paintComponent метод

Из моего «красного прямоугольника "период ...

Red Rectangle

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.Shape; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Tester { 

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

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

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JPanel panel; 
     private JButton button; 
     private JLabel label; 
     private ShapePane shapePane; 

     public TestPane() { 
      setLayout(new BorderLayout()); 
      button = new JButton("Rectangle"); 
      panel = new JPanel(); 
      label = new JLabel(); 

      button.setVisible(true); 
      panel.add(button); 
      panel.add(label); 

      shapePane = new ShapePane(); 

      add(shapePane); 
      add(panel, BorderLayout.SOUTH); 

      class ClickListener implements ActionListener { 

       private int X = 20; 
       private int Y = 20; 

       @Override 
       public void actionPerformed(ActionEvent arg0) { 
        int width = shapePane.getWidth(); 
        int height = shapePane.getHeight(); 

        int x = (int)(Math.random() * (width - 20)) + 10; 
        int y = (int)(Math.random() * (height - 20)) + 10; 

        int w = (int)(Math.random() * (width - x)); 
        int h = (int)(Math.random() * (height - y)); 

        shapePane.add(new Rectangle(x, y, w, h)); 
       } 

      } 
      ActionListener listener = new ClickListener(); 
      button.addActionListener(listener); 
     } 

    } 

    public class ShapePane extends JPanel { 

     private List<Shape> shapes; 

     public ShapePane() { 
      shapes = new ArrayList<>(25); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     public void add(Rectangle rectangle) { 
      shapes.add(rectangle); 
      repaint(); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D) g; 
      g2.setColor(Color.RED); 
      for (Shape shape : shapes) { 
       g2.draw(shape); 
      } 
     } 
    } 
} 

Как ответить на ваш основной вопрос, вы могли бы иметь пытались дозвониться revalidate и repaint, но из-за BorderLayout я сомневаюсь, что это сработало бы, как вы бы в основном пытались заменить panel с ShapeChanger компонентом, и есть лучшие способы сделать это

+0

Спасибо за ответ. Я проверил ваш, и он работает красиво, и он работал так же, как и я. Мне просто жаль, что я не понял ваш код :( –

+0

Это в основном ваш собственный код, реорганизованный – MadProgrammer

Смежные вопросы