Как отобразить графику из другого класса - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь отобразить графику из отдельного класса на JPanel моего основного класса.

Основной класс mytest, а отдельный класс - Ball. Ball имеет метод рисования компонентов и просто рисует цветной круг. В моем случае я создаю экземпляр мяча и добавляю его в JPanel (dp): dp.add (ball). Очень просто, но все, что я получаю, это белый фон панели, а шар не рисуется.

Вот мой самый код:

package myStuff;

import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class mytest {
    private JFrame frame=new JFrame();
    private JPanel dp = new JPanel();


    public static void main(String[] args) {
        mytest gui = new mytest();
        gui.go();
    }
    public void go() {      
        frame.setTitle("Test");
        frame.setSize(1000,600);        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel dp=new JPanel();
        dp.setBackground(Color.WHITE);
        Ball ball = new Ball(dp.getWidth(),dp.getHeight());
        dp.add(ball);
        frame.add(dp);
        frame.setVisible(true);
    }
}

и вот класс Ball код:

package myStuff;

import java.awt.*;
import javax.swing.*;

public class Ball extends JComponent{

    private int Width; 
    private int Height; 
    public Ball (int width, int height ) {
        Width=width;
        Height=height;      
    }

    @Override
    public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        super.paintComponent(g2d);
        g2d.setColor(Color.RED);
        g2d.fillOval(Width/2,Height/2,40,40);
        System.out.println("Doing graphics....");
    }
}

На панели ДП должен появиться красный шар. Все, что я получаю, это фон панели, а не мяч. Я знаю, что он пытается, так как «Doing graphics» печатает дважды.

Ответы [ 3 ]

1 голос
/ 17 апреля 2019

Вот рабочий пример.

import java.awt.*;
import javax.swing.*;

public class Mytest {
   private JFrame frame = new JFrame();

   public static void main(String[] args) {
      Mytest gui = new Mytest();
      SwingUtilities.invokeLater(() -> gui.go());
   }

   public void go() {
      frame.setTitle("Test");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      JPanel dp = new JPanel();
      dp.setPreferredSize(new Dimension(500, 500));
      dp.setBackground(Color.WHITE);
      Ball ball = new Ball(150, 150);
      dp.add(ball);
      frame.add(dp);
      frame.pack(); // invokes layout and sizes components
      frame.setLocationRelativeTo(null); // centers on screen
      frame.setVisible(true);
   }

}

class Ball extends JComponent {

   private int width;
   private int height;

   // A ball should probably only have a "diameter"
   public Ball(int width, int height) {
      this.width = width;
      this.height = height;
      setPreferredSize(new Dimension(width, height));
   }

   @Override
   public void paintComponent(Graphics g) {
      Graphics2D g2d = (Graphics2D) g;
      super.paintComponent(g2d);
      g2d.setColor(Color.RED);
      // smooths out the graphics
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
      g2d.fillOval(0, 0, width, height);
      System.out.println("Doing graphics....");
   }
}

Два самых больших предложения:

  1. Убедитесь, что при изменении компонента Swing вы делаете это в потоке диспетчеризации событий.
  2. И используйте сглаживание, чтобы сделать ваш рисунок более плавным (обратите внимание, что это необязательно, и это может добавить дополнительные накладные расходы на обработку.)

Причина, по которой красный шар не был нарисован (или только 1/4 от него), заключалась в том, что вы изменили место, где его рисовать, в окне компонентов. Вы пытались нарисовать его на ширине / 2 и высоте / 2, которые были центром компонента. Для нормального рендеринга это должно было быть 0,0.

Также читайте о живописи в уроках Java 1

0 голосов
/ 17 апреля 2019

Установить размер панели перед линией,

Ball ball = new Ball(dp.getWidth(),dp.getHeight());

Затем добавьте этот код

setPreferredSize(new Dimension(Width, Height));

в конце конструктора "Шарик".

См. вопрос о стеке для более подробной информации.

0 голосов
/ 17 апреля 2019

Вы устанавливаете размер рамки, но панель имеет нулевой размер.Вы должны установить предпочтительный размер панели, а не размер рамки.Затем получите желаемый размер панели для передачи конструктору Ball и упакуйте рамку, прежде чем сделать ее видимой.

...