我有三个类 - 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
中,您应该通过使其可见>添加(..)
每个
Diner
的直径也是300
并且相同的x
和y
co-50x50
的纵坐标将在每个Diner
的顶部绘制所有TablePanel
,首选大小为200x300
将不适合所有表格。所以基本上坐标需要重新设计和/或面板尺寸需要更改。您不应在
JFrame
上调用setSize(..)
,而应实现正确的LayoutManager
和/或覆盖getPreferredSize ()
以适应JPanel
上的绘图内容(注意使用setPreferredSize(..)
不是好的做法)并且调用pack()
在添加组件之后和设置JFrame
可见之前。请记住通过
SwingUtilities.invokeXXX
block 在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);
}
}
关于java 图形 paintComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14594013/