1

TableApp/Diner/TablePanel の 3 つのクラスがあります。グラフィッククラスの仕組みがよくわかりません。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);
        }
}
4

2 に答える 2

4
  • 、などを呼び出してコンテナをリフレッシュするpaintComponent(..)だけの呼び出しが必要な場合は、呼び出しません。repaint()update(..)paint(..)paintComponent(..)

  • あなたのコードでTablePanel tableJFrameadd(..)

  • 300また、 for eachDinerと同じ直径とxy座標は、それぞれの上に50x50すべての をペイントし、好ましいサイズのはすべてのテーブルに収まりません。したがって、基本的には座標を再加工する必要があります。またはパネルサイズの変更が必要です。DinerTablePanel200x300

  • コンポーネントを追加した後、表示を設定する前に呼び出すよりも、図面の内容に合わせて正しいおよび/またはオーバーライドを実装setSize(..)するのではなく( を使用するのは良い習慣ではないことに注意してください)、呼び出してはなりません。JFrameLayoutManagergetPreferredSize()JPanelsetPreferredSize(..)pack()JFrame

  • Event Dispatch ThreadviaSwingUtilities.invokeXXXブロックで Swing コンポーネントを作成して操作することを忘れないでください。

  • Graphics2Dそして、それらの円を完璧にRenderingHints見せるためにいくつかはどうですか:)

  • 私が示していないさらなる機能強化は、 を使用して ( likeListのメソッド呼び出しを介して)を追加し、 に追加するすべてのクラス インスタンスを追跡することです。これにより、冗長なコード行ではなく、リストを単純に反復処理できます。TablePaneladdDiner(Diner d)DinerTablePanelpaintComponent

上記の修正を加えたコードは次のとおりです。

ここに画像の説明を入力

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);
    }
}
于 2013-01-30T00:14:40.283 に答える
2

Graphics オブジェクトを paintComponent に渡さないでください。これは、コンポーネントをフレームに追加するときに、(誰かが言ったように) Swing によって実行され、呼び出されます。したがって、メインで行っていないのは次のとおりです

frame.add(table)

コンポーネントをフレームに追加すると、フレームに描画されます。

于 2013-01-30T00:13:49.437 に答える