【问题标题】:java graphics paintComponentjava图形绘制组件
【发布时间】:2013-01-13 16:17:54
【问题描述】:

我有三个课程 - TableApp/Diner/TablePanel。 我不太明白图形类是如何工作的。我需要从我的 main 方法向我的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);
        }
}

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2) 暂时忘记你想要做什么,你想要实现什么?我的意思是,它对最终用户来说是什么“功能”。您想为用户提供什么功能
  • 你自己不要调用paintComponent(),Swing会在组件需要渲染的时候调用。
  • “需要向我的paintComponent 发送一个Graphics 对象引用” 为什么? paintComponent 将由负责创建/维护有效图形上下文的重绘引擎代表您调用。一旦添加到容器中,Diner 将被自动绘制...
  • @MadProgrammer - 这是一个课堂实验室。实验室说明说“设置一个将 Graphics 对象作为参数的paintComponent 方法”。我不明白如何在不向该方法发送参考的情况下绘制图像。当程序运行时,会弹出一个空的 java 窗口。我的 main 不应该调用至少一种外部方法吗?
  • @Quigg15405 为什么要编辑您的帖子以删除 SSCCE?

标签: java swing graphics jpanel paintcomponent


【解决方案1】:
  • 如果需要,您不要调用paintComponent(..),只需调用repaint(),它将通过调用update(..)paint(..)paintComponent(..) 等来刷新容器。

  • 在您的代码中,您永远不要将TablePanel table 添加到您的JFrame 中,您应该这样做以使其通过add(..) 可见

  • 每个Diner 的直径为300xy 的相同50x50 坐标将在每个Diners 和@987654337 的顶部绘制所有Diners @ 的首选尺寸为200x300 不会适合所有表格。所以基本上坐标需要重新加工和/或面板尺寸需要改变。

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

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

  • 还有一些 Graphics2DRenderingHints 怎么样让这些圈子看起来很完美:)

  • 1234563 TablePanel。这您只需遍历 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);
    }
}

【讨论】:

    【解决方案2】:

    您不会将 Graphics 对象传递给paintComponent。当您将组件添加到框架时,这将由 Swing 完成并调用(正如有人所说)。所以你在 main 中没有做的是以下

    frame.add(table)
    

    将组件添加到框架后,它将在框架上绘制。

    【讨论】:

    • 谢谢!它正在画一个蓝色的大圆圈:D
    猜你喜欢
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多