2013-11-25 1 views
1

Здравствуйте, Я пытаюсь решить следующую проблему: Напишите программу, которая предложит пользователю ввести x- и y-позиции центральной точки и радиуса, используя текстовые поля. Когда пользователь нажимает кнопку «Рисовать», нарисуйте круг с центром и радиусом в компоненте. Я не вижу, что не так в моем коде, но что-то происходит потому, что не похоже, что repaint() вызывает paintComponent(), поскольку сообщение изменится на TESTING 1, но не TESTING 2, и рисунок не будет сделан. Мой код:repaint() не вызывает paintComponent()?

import java.util.*; 
import javax.swing.*; 
import java.awt.*; 
import java.applet.*; 
import java.awt.geom.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
public class q3{ 

    public static class cgPanel extends JPanel{ 
     private static double x; 
     private static double y; 
     private static double r; 
     private static JTextField xField; 
     private static JTextField yField; 
     private static JTextField rField; 
     private static JButton draw; 
     private static JLabel message; 
//This is all just Layout work. 
     public cgPanel(){ 
      setLayout(new BorderLayout()); 
      JPanel drawPanel = new JPanel(); 
      drawPanel.setBackground(Color.WHITE); 
      add(drawPanel, BorderLayout.CENTER); 
      message = new JLabel(""); 
      JPanel sub1ForSub1 = new JPanel(); 
      sub1ForSub1.add(message); 
      JLabel coordinates = new JLabel("Coordinates:"); 
      JPanel sub2ForSub1 = new JPanel(); 
      sub2ForSub1.add(coordinates); 
      JPanel subPanel1 = new JPanel(); 
      subPanel1.setLayout(new GridLayout(2, 1)); 
      subPanel1.add(sub1ForSub1); 
      subPanel1.add(sub2ForSub1); 
      JLabel xLabel = new JLabel("x:"); 
      xField = new JTextField(4); 
      JLabel yLabel = new JLabel(" y:"); 
      yField = new JTextField(4); 
      JLabel rLabel = new JLabel(" Radius:"); 
      rField = new JTextField(4); 
      JPanel subPanel2 = new JPanel(); 
      subPanel2.add(xLabel); 
      subPanel2.add(xField); 
      subPanel2.add(yLabel); 
      subPanel2.add(yField); 
      subPanel2.add(rLabel); 
      subPanel2.add(rField); 
      draw = new JButton("Draw"); 
      ActionListener bL = new ButtonListener(); 
      draw.addActionListener(bL); 
      JPanel subPanel3 = new JPanel(); 
      subPanel3.add(draw); 
      JPanel Panel = new JPanel(); 
      Panel.setLayout(new BorderLayout()); 
      Panel.add(subPanel1, BorderLayout.NORTH); 
      Panel.add(subPanel2, BorderLayout.CENTER); 
      Panel.add(subPanel3, BorderLayout.SOUTH); 
      add(Panel, BorderLayout.SOUTH); 
      setVisible(true); 
     } 
     static class ButtonListener extends JComponent implements ActionListener{ 
      public void actionPerformed(ActionEvent e){ 
       try{ 
        String xString = xField.getText(); 
        String yString = yField.getText(); 
        String rString = rField.getText(); 
        message.setText("TESTING 1"); 
        x = Double.parseDouble(xString); 
        y = Double.parseDouble(yString); 
        r = Double.parseDouble(rString); 
        repaint(); 
       } 
       catch (NumberFormatException exception){ 
        message.setText("Please enter a number."); 
       } 
      } 
//This is where I cant seem to get the code in paintComponent to run when the Draw button is pressed. 
      public void paintComponent(Graphics g){ 
       Graphics2D g2 = (Graphics2D) g; 
       Ellipse2D.Double circle = new Ellipse2D.Double(x - r, y - r, r*2, r*2); 
       g2.draw(circle); 
       message.setText("TESTING 2"); 
      } 
     } 
    } 
    public static void main(String[] args){ 
     JFrame frame = new JFrame(); 
     frame.setSize(800, 800); 
     frame.setTitle("Circle Generator"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     cgPanel panel = new cgPanel(); 
     frame.add(panel); 
     frame.setVisible(true); 
    } 
} 

ответ

0

Так, несколько вещей.

Ваша проблема связана с тем, что ваш ButtonListener расширяет JComponent, поэтому метод repaint() вызывает одно для ButtonListener (что на самом деле не является JComponent).

И метод paintComponent также подходит для ButtonListener.

Вместо этого вы хотите, чтобы ваш прослушиватель кнопок имел доступ к вашей cgPanel, поэтому он может сказать, что IT перерисовывает. И ваш paintComponent нужно перенести в cgPanel, но даже тогда вы, вероятно, не хотите его там, так как у вас есть куча других компонентов на cgPanel.

Это не ясно из вашего кода, где вы действительно хотите, чтобы круг был нарисован.

Возможно, вы должны создать CirclePanel, который расширяет JPanel, и переопределяет paintComponent, чтобы нарисовать круги, а затем добавить это в ваш cgPanel. Затем запустите ButtonListener, чтобы экземпляр CirclPanel перерисовал.

+0

Когда я пытаюсь что-то вроде этого, я получаю сообщение об ошибке при попытке использовать нестатический метод repaint() в статическом контексте. – Reddy

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

  • Нет связанных вопросов^_^