[英]java graphics paintComponent
我有三個類 - TableApp/Diner/TablePanel。 我不太明白圖形類是如何工作的。 我需要從我的主要方法向我的paintComponent發送一個Graphics對象引用,但我不確定如何將它鏈接在一起。 任何有關如何如此有幫助的解釋!
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
}
}
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
和相同的x
和y
的坐標50x50
能畫出所有Diner
S於每個的頂部和TablePanel
用的優選尺寸200x300
將不適合所有的表(多個)英寸所以基本上坐標需要重新加工和/或面板尺寸需要改變。
您不應該在JFrame
上調用setSize(..)
而是實現正確的LayoutManager
和/或覆蓋getPreferredSize()
以適應JPanel
上的繪圖內容(注意使用setPreferredSize(..)
不是好的做法),而不是在添加后調用pack()
組件並在設置JFrame
可見之前。
請記住通過SwingUtilities.invokeXXX
塊在Event Dispatch Thread
上創建和操作 Swing 組件。
以及一些Graphics2D
和RenderingHints
如何使這些圓圈看起來完美:)
我沒有展示的進一步增強是使用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.