簡體   English   中英

如何顯示另一個班級的圖形

[英]How to display a graphic from another class

我試圖在主類的JPanel上顯示來自單獨類的圖形。

主要課程是mytest,單獨的課程是Ball。 球具有繪畫成分方法,並且僅繪制一個彩色圓圈。 在mytest中,我實例化了一個球並將其添加到JPanel(dp):dp.add(ball)。 非常簡單,但是我所得到的只是白色面板背景,沒有繪制球。

這是mytest代碼:

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);
    }
}

這是班級代碼:

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....");
    }
}

dp面板上應出現一個紅色的球。 我得到的只是面板背景,沒有球。 我知道它正在嘗試,因為“執行圖形”打印了兩次。

這是一個工作示例。

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. 確保更改事件組件時在事件調度線程上執行此操作。
  2. 並使用抗鋸齒功能使您的圖形看起來更平滑(請注意,這是可選的,它會增加額外的處理開銷。)

之所以沒有繪制紅球(或僅繪制一個紅球的1/4),是因為您更改了在“組件”窗口中繪制紅球的位置。 您試圖在width / 2和height / 2(組件的中心)處繪制它。 對於常規渲染,該值應為0,0。

另請參閱The Java Tutorials 1中有關繪畫的內容

您正在設置框架的尺寸,但是面板的尺寸為零。 您應該設置面板的首選大小,而不是框架的大小。 然后獲取面板的首選大小,以傳遞給Ball構造函數,並在使框架可見之前打包框架。

在行前設置面板尺寸,

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

然后添加此代碼

setPreferredSize(new Dimension(Width, Height));

在“球”構造函數的末尾。

有關更多詳細信息,請參見此堆棧問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM