java 图形 paintComponent

标签 java swing graphics jpanel 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 中,您应该通过 使其可见>添加(..)

  • 每个 Diner 的直径也是 300 并且相同的 xy co- 50x50 的纵坐标将在每个 Diner 的顶部绘制所有 TablePanel,首选大小为 200x300 将不适合所有表格。所以基本上坐标需要重新设计和/或面板尺寸需要更改。

  • 您不应在 JFrame 上调用 setSize(..),而应实现正确的 LayoutManager 和/或覆盖 getPreferredSize () 以适应 JPanel 上的绘图内容(注意使用 setPreferredSize(..) 不是好的做法)并且调用 pack() 在添加组件之后和设置 JFrame 可见之前。

  • 请记住通过 SwingUtilities.invokeXXX block 在 Event Dispatch Thread 上创建和操作 Swing 组件。

  • 还有一些 Graphics2DRenderingHints 如何使这些圆圈看起来完美:)

  • 我没有展示的进一步增强是使用 List 添加(通过 TablePanel 中的方法调用,例如 addDiner(Diner d) ) 并跟踪您添加到 TablePanel 的所有 Diner 类实例。您只需遍历 paintComponent 中的列表,而不是冗余代码行。

这是您的代码,其中包含上述修复:

enter image description here

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/

相关文章:

graphics - 绘制抗锯齿粗线的算法

java - Selenium 网络驱动程序 : can I check if a resource (e. g。 XML 文件)已加载?

java - Gson TypeToken 是如何工作的?

java - JTextField 插入符号未正确显示

java - 如何使方法的数组可访问

java - 让另一个类在 actionListener 中工作

Java:使用drawArc绘制圆形螺旋

c# - 在窗口上绘制位图时不需要的抗锯齿

java - 为什么@Autowired注释将同一类的每个bean关联到context.xml中?

c# - 为什么头文件没有在其他编程语言中流行起来?