2016-08-28 26 views
0

JFrameに矩形が表示されないようです。このプロジェクトのパラメータによって、このクラスにIconインターフェイスを実装させる必要があります。コードをそのまま実行すると、JFrameが取得されますが、内部には何も表示されません。それは黒い四角を表示する必要があります。私は問題がグラフィックインスタンス変数をどのように初期化しているかと関係があると仮定しています。私はGUIグラフィックスでの作業経験はあまりないので、これを正しく行う方法は完全にはわかりません。JFrameに何も表示されない

はい、私は定数を使用しているので、getIconWidthメソッドとgetIconHeightメソッドが冗長であることを知っていますが、インターフェイスを実装するにはこれらのメソッドが必要です。

public class MugDisplay extends JFrame implements Icon { 
private int width; 
private int height; 
private JPanel panel; 
private Graphics graphics; 

private static final int ICON_WIDTH = 100; 
private static final int ICON_HEIGHT = 100; 


public MugDisplay() { 
    this.configureGui(); 
    this.panel = new JPanel(); 
    this.panel.setLayout(new BorderLayout()); 
    this.add(this.panel, BorderLayout.CENTER); 
    this.graphics = this.getGraphics(); 
    int xPos = (this.panel.getWidth() - this.getIconWidth())/2; 
    int yPos = (this.panel.getHeight() - this.getIconHeight())/2; 
    this.paintIcon(this.panel, this.graphics, xPos, yPos); 
} 


@Override 
public void paintIcon(Component c, Graphics g, int x, int y) { 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setColor(Color.BLACK); 
    g2.fillRect(x, y, ICON_WIDTH, ICON_HEIGHT); 
} 


@Override 
public int getIconWidth() { 
    return ICON_WIDTH; 
} 


@Override 
public int getIconHeight() { 
    return ICON_HEIGHT; 
} 

private void configureGui() { 
    this.setPreferredSize(new Dimension(600, 600)); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.getContentPane().setLayout(new BorderLayout()); 
    this.pack(); 
    this.setVisible(true); 
} 

} 

このクラスを呼び出すドライバクラスは、MCVEを持つためにここにあります。

public class Main { 

public static void main(String[] args) { 
    MugDisplay md = new MugDisplay(); 
    md.setVisible(true); 
} 

} 
+0

'this.getGraphics();'を使用してグラフィックスを取得せず、コンストラクタで 'paintIcon'を呼び出しません。フレームの 'paint'メソッドをオーバーライドし、' super.paint(g) 'を呼び出し、xとyを計算し、そこに' paintIcon'を呼び出します(paintメソッドのグラフィックインスタンスを解析します)。この場合、フレームの 'paint'をオーバーライドする利点が本当にわからないので、代わりに' JPanel'に切り替えて 'paintComponent'をオーバーライドすることも考えてください。 –

答えて

3

スイングでのカスタム塗装の仕組みではありません。パネルを作成し、paintComponentメソッドをオーバーライドし、superを呼び出してに電話をかけてください。例えば:getGraphicsを呼び出す

panel = new JPanel() { 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     int xPos = ... 
     paintIcon(this, g, xPos, yPos); 
    } 
} 

はすぐにいつもあなたに利用できるGraphicsオブジェクトを与えるであろう、あなたの代わりにpaintComponentをオーバーライドを選ぶ必要が理由である、無効になることができ短命Graphicsオブジェクトを提供します。 Performing Custom Paintingを参照してください。

別途、JFrameに必要なコンポーネントを追加する前にsetVisible(true)と呼んでいるようです。コンポーネントが表示されるようにするには、フレームにすべて追加した後にsetVisible(true)に電話してください。

+0

ありがとうございます。それが私の問題を解決しました。私はあなたがその構文を持つパネルを宣言できるかどうかも知りませんでした。 – matt

関連する問題