簡體   English   中英

java圖形paintComponent

[英]java graphics paintComponent

我有三個類 - TableApp/Diner/TablePanel。 我不太明白圖形類是如何工作的。 我需要從我的主要方法向我的paintComponent發送一個Graphics對象引用,但我不確定如何將它鏈接在一起。 任何有關如何如此有幫助的解釋!

TableApp 類

import javax.swing.*;
public class TableApp{
  public static void main(String[]args){    
  JFrame frame = new JFrame();
  TablePanel table = new TablePanel();
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setVisible(true);
  frame.setSize(500,500);  //I dont understand how to send my paintComponent a                    reference of a Graphics object
  } 
}

TablePanel 類

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

public class TablePanel extends JPanel{

  Diner diner1,diner2,diner3,diner4,diner5,diner6;

  public TablePanel(){
    diner1 = new Diner(50,50,300,1,"Murray",Color.blue);
    diner2 = new Diner(50,50,300,1,"Murray",Color.blue);//will change once program runs
    diner3 = new Diner(50,50,300,1,"Murray",Color.blue);
    diner4 = new Diner(50,50,300,1,"Murray",Color.blue);
    diner5 = new Diner(50,50,300,1,"Murray",Color.blue);
    diner6 = new Diner(50,50,300,1,"Murray",Color.blue);

    setPreferredSize(new Dimension(300,200));
    setBackground(Color.white);


  }
  public void paintComponent(Graphics g){//need call from main
    super.paintComponent(g);
    diner1.draw(g);
    diner2.draw(g);
    diner3.draw(g);
    diner4.draw(g);
    diner5.draw(g);
    diner6.draw(g);
  }

}

晚餐課程

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

    public class Diner{
      private int X,Y,diameter=50,seatNumber;
      private String name;
      private Color colour;

      public Diner(int x,int y,int d,int sN,String n,Color col){//construct
        X=x;
        Y=y;
        name=n;
        diameter=d;
        name=n;
        colour=col;

    }
      public void draw(Graphics g){
            g.setColor(Color.blue);
            g.fillOval(X,Y,diameter,diameter);
        }
}
  • 如果需要,您不要調用paintComponent(..) ,只需調用repaint() ,它將通過調用update(..)paint(..)paintComponent(..)等來刷新容器。

  • 在您的代碼中,您永遠不會將TablePanel table添加到您的JFrame ,您應該這樣做以通過add(..)

  • 還直徑300為每個Diner和相同的xy的坐標50x50能畫出所有Diner S於每個的頂部和TablePanel用的優選尺寸200x300將不適合所有的表(多個)英寸所以基本上坐標需要重新加工和/或面板尺寸需要改變。

  • 您不應該在JFrame上調用setSize(..)而是實現正確的LayoutManager和/或覆蓋getPreferredSize()以適應JPanel上的繪圖內容(注意使用setPreferredSize(..)不是好的做法),而不是在添加后調用pack()組件並在設置JFrame可見之前。

  • 請記住通過SwingUtilities.invokeXXX塊在Event Dispatch Thread上創建和操作 Swing 組件。

  • 以及一些Graphics2DRenderingHints如何使這些圓圈看起來完美:)

  • 我沒有展示的進一步增強是使用List添加(通過TablePanel的方法調用,如addDiner(Diner d) )並跟蹤您添加到TablePanel的所有Diner類實例。 這將簡單地遍歷paintComponent的列表而不是冗余的代碼行。

這是帶有上述修復程序的代碼:

在此處輸入圖片說明

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TableApp {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                TablePanel table = new TablePanel();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(table);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

class TablePanel extends JPanel {

    Diner diner1, diner2, diner3, diner4, diner5, diner6;

    public TablePanel() {
        diner1 = new Diner(10, 90, 20, 1, "Murray", Color.blue);
        diner2 = new Diner(70, 30, 20, 1, "Murray", Color.blue);//will change once program runs
        diner3 = new Diner(50, 60, 20, 1, "Murray", Color.blue);
        diner4 = new Diner(100, 90, 20, 1, "Murray", Color.blue);
        diner5 = new Diner(80, 120, 20, 1, "Murray", Color.blue);
        diner6 = new Diner(100, 30, 20, 1, "Murray", Color.blue);
        setBackground(Color.white);
    }

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

    public void paintComponent(Graphics g) {//need call from main
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        diner1.draw(g2d);
        diner2.draw(g2d);
        diner3.draw(g2d);
        diner4.draw(g2d);
        diner5.draw(g2d);
        diner6.draw(g2d);
    }
}

class Diner {

    private int X, Y, diameter = 50, seatNumber;
    private String name;
    private Color colour;

    public Diner(int x, int y, int d, int sN, String n, Color col) {//construct
        X = x;
        Y = y;
        name = n;
        diameter = d;
        name = n;
        colour = col;

    }

    public void draw(Graphics2D g2d) {
        g2d.setColor(Color.blue);
        g2d.fillOval(X, Y, diameter, diameter);
    }
}

您沒有將 Graphics 對象傳遞給paintComponent。 當您將組件添加到框架時,這將由 Swing 完成並調用(正如有人所說)。 所以你沒有在主要做的是以下

frame.add(table)

將組件添加到框架后,它將被繪制在框架上。

暫無
暫無

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

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