2017-11-21 10 views
1

印刷白いウィンドウを(私はJFrameのがどのように動作するかを把握しようとしている)キープ:は、私はこの非常に簡単なプログラムのこれらのメソッドを書いた

import java.util.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.*; 

import javax.imageio.*; 
import javax.swing.*; 

public class Display extends JFrame { 
    private int larg = 512; 
    private int lung = 512; 

    public Display() { 
     setSize(larg, lung); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
    } 

    public void draw(Graphics gr) { 
     Color color = new Color(100, 200, 0); 
     gr.setColor(color); 
     gr.fillRect(0, 0, larg, lung); 
    } 

    public static void main(String[] args) { 
     new Display(); 
    } 
} 

が、彼らは白いウィンドウではなく、(100、200を印刷しておきます、0)ウィンドウ、それはなぜですか?

+0

[MCVE]またはそれは、プログラムは非常に基本的なもの、私はJFrameの使用方法を学んでいる –

+0

をhappentませんでした...あなたが望むなら私はすべてのコードを投稿します – dulindraxe

+0

それは基本的ですが、どういうわけかそれは間違っています、そして、私はどのように伝えるべきか分かりません。途中で '' draw(...) 'と呼ぶものは何ですか?それはどこかの塗装方法の中から呼び出されていますか? –

答えて

3

あなたは独自のペインティングメソッドを作成しています。描画して、何とかそれが魔法のように呼び出されることを前提としています。これは起こることではなく、スインググラフィックスの仕組みではありません。 Googleを使ってチュートリアルを実行しますが、実際のペイントメソッド(親コンポーネント内にあるもの)(JFrameの場合はpaint、JPanelの場合はpaintComponent)をオーバーライドする必要があることがわかります。make sure通常、@Overrideアノテーションを使用してメソッドを正しくオーバーライドすると、それが機能しません。

チュートリアルでは、とにかくJFrame内ではなく、JPanelのpaintComponentオーバーライドで直接描画しないように指示します。

ストーリーのモラル:コーディングの仕組みを推測しないで、代わりにプライマリソース(ここではチュートリアル)に行き、正しい方法を確認してください。例えば

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics;  
import javax.swing.*; 

@SuppressWarnings("serial") 
public class MyDraw extends JPanel { 

    private static final Color RECT_COLOR = new Color(100, 200, 0); 
    private int larg; 
    private int lung; 

    public MyDraw(int larg, int lung) { 
     this.larg = larg; 
     this.lung = lung; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(RECT_COLOR); 
     g.fillRect(0, 0, larg, lung); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(larg, lung); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("MyDraw"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     int larg = 512; 
     int lung = 512; 
     frame.getContentPane().add(new MyDraw(larg, lung)); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

スイング絵画チュートリアル:Lesson: Performing Custom Painting

+0

大丈夫、ヒントありがとう! – dulindraxe

+1

@dulindraxe:編集と[リンク](https://docs.oracle.com/javase/tutorial/uiswing/painting/index.html)を参照してください –

+0

もう一度ありがとう、私はそうする必要があるのか​​分からなかった – dulindraxe

関連する問題