2015-09-13 1 views
1

Первый проект Java, поэтому этот вопрос, вероятно, очень любитель. Я пытаюсь запустить метод paintComponent для рисования фигур в классе, который расширяет JFRAME. Я просто не могу понять, как его называть. Нужно ли создавать графическую переменную для работы в качестве фона, поэтому я могу вызвать paintComponent (background)? Или, может быть, новый Planel?Java-реализация графики g?

import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.*; 
import java.awt.Graphics.*; 
import java.awt.event.*; 
import java.text.*; 
public class Pythag extends JFrame implements ActionListener 
{ 

JTextField text1,text2; 
JLabel label1,label2,label3; 
JButton buttonC; 
public Pythag(){ 
    super ("Pythagorean Theorem"); 
    // Set up the frame 
    this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    this.setBounds (300, 300, 200, 350); 
    //creating objects 
    JPanel boxY = new JPanel(); 
    boxY.setLayout(new BoxLayout(boxY,BoxLayout.Y_AXIS)); 
    label1 = new JLabel ("A side length",JLabel.CENTER); 
    label2 = new JLabel ("B side length",JLabel.CENTER); 
    label3 = new JLabel ("Type in side lengths to calculate hypotenuse",JLabel.CENTER); 
    buttonC = new JButton ("Button1"); 
    text1 = new JTextField (10); 
    text2 = new JTextField (10); 

    //Nestled flow layouts: 
    //layout1 
    JPanel line = new JPanel(); 
    line.add(label1); 
    line.add(text1); 
    boxY.add(line); 

    //layout2 
    JPanel line2 = new JPanel(); 
    line2.add(label2); 
    line2.add(text2); 
    boxY.add(line2); 
    //layout 3 

    JPanel line3 = new JPanel(); 
    line3.add(label3); 
    boxY.add(line3); 
    //layout 4 

    JPanel line4 = new JPanel(); 
    line4.add(buttonC); 
    boxY.add(line4); 
    //Adding listeners 
    buttonC.addActionListener (this); 
    text1.addActionListener (this);   
    text2.addActionListener (this);   

    //Setting up 
    this.setContentPane (boxY); 
    this.setVisible (true); 
    this.setSize(450,200); 
    // this.add(panel); 
    // Graphics bg = backbuffer.getGraphics(); 

} 

public void actionPerformed (ActionEvent e) 
{ 
    if (e.getSource() == buttonC) 
    { 
     calculate(); 

    } 

} 

public void calculate(){ 
    double a,b; 
    DecimalFormat Formatter = new DecimalFormat("#0.00"); 
    try 
    { 
     a = Double.parseDouble (text1.getText()); 
     b = Double.parseDouble (text2.getText()); 
     double hypot=Math.sqrt(a*a + b*b); 
     label3.setText("The length of the hypotenuse is: " + Formatter.format(hypot)); 
    } 
    catch (NumberFormatException ex) 
    { 

     label3.setText("You're clearly a confused, please use NUMBERS for side lengths."); 

    } 

} 
public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g.fillRect(100,100,20,20); 

} 


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

} // main method 
} 
+3

Я не понимаю, в чем ваш вопрос, но вы должны называть 'super.paintComponent (g)' на JPanels с Graphics. (также используйте 'paintComponent (Graphics g)', а не 'paint (Graphics g)' на JPanels). Может быть, [mcve] был бы полезен :) –

+0

@ LuxxMiner Извините. Поэтому я использую класс, который расширяет JFrame. – Trows

+0

. Вы в основном НЕ МОЖЕТЕ использовать класс, который расширяет JFrame в апплете. Вы должны использовать класс, который расширяет JApplet. Другого пути нет. Вы также не можете использовать 'public static void main()' в апплете, но, возможно, это просто для тестирования. – markspace

ответ

3

Если вы хотите переопределить paint(), то только верхнего уровня контейнеров, см this для более полного объяснения. Тем не менее, самым «чистым» способом является создание нового класса, который расширяет JPanel и переопределяет paintComponent(). Если вы хотите перерисовать панель во время выполнения, вы можете просто позвонить repaint(). Это пример:

import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.*; 
import java.awt.Graphics.*; 
import java.awt.event.*; 
import java.text.*; 
import java.util.Random; 

public class Pythag { 

    public Pythag() { 

     JFrame frame = new JFrame("JFrame"); 

     frame.setContentPane(new MyPanel()); 

     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setSize(500, 500); 
     frame.setVisible(true); 

    } 

    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Pythag(); 
      } 
     }); 

    } 

    public class MyPanel extends JPanel { 

     int x; 
     int y; 

     public MyPanel() { 

      ActionListener al = new ActionListener() { 
       Random r = new Random(); 

       @Override 
       public void actionPerformed(ActionEvent e) { 

        x = r.nextInt(getWidth()); // Random x-coordinate 
        y = r.nextInt(getHeight()); // Random y-coordinate 
        repaint(); // Repaints the panel 

       } 
      }; 

      Timer timer = new Timer(500, al); // Runs ever 500 milliseconds. 
      timer.start(); 

     } 

     @Override 
     public void paintComponent(Graphics g) { 

      super.paintComponent(g); // Removes previous drawings 

      g.setColor(Color.RED); 
      g.fillRect(x, y, 10, 10); 

     } 

    } 

}