2016-09-24 16 views
0

私は時間のためにこのコードをチェックしますが、矩形が、それが表示されない原因?:なぜ四角形が表示されないのですか?

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Main { 

    public static void main(String[] args) { 

     JFrame frame = new JFrame(); 
     int resx = 700,resy = 500; 
     frame.setSize(resx,resy); 
     frame.setLocationRelativeTo(null); 
     frame.setTitle("Game"); 
     frame.setResizable(false); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new FlowLayout()); 
     try { 
      frame.setContentPane(new JLabel(new ImageIcon(ImageIO.read(new File("C:\\Users\\ivans\\Pictures\\Cookies.png"))))); 
     } catch (IOException e) { 
     } 
     frame.repaint(); 
     frame.setLayout(new FlowLayout()); 
     frame.add(new JPanel(){ 
      @Override 
      public void paintComponent(Graphics g){ 
       super.paintComponent(g); 
       g.setColor(Color.WHITE); 
       g.fillRect(50,50,450,650); 
      } 
     }, BorderLayout.CENTER); 
     frame.repaint(); 
     frame.setVisible(true); 
    } 

} 

私は背景をアクティブにしようとするたびに、誰もが私を伝えることができ、表示されていない、矩形が示されていない、と矩形をアクティブにするたびに、背景は表示されません。助けてください!

+0

あなたのtry {...}ボディが正常に実行されていますか?空のcatch {}セクションを持つことは非常に悪い練習です –

+0

"Except"の演習ではどうしたらいいですか? – user3150362

+0

スタックトレースを印刷してプログラムを終了する必要があります。画像の読み込みで例外がスローされた場合は、実行したくないでしょう。 –

答えて

1

JFrameのcontentPaneをレイアウトを使用しないJLabelに設定するので、コンポーネントを追加すると、そのコンポーネントのサイズと位置を完全に指定しない限り、そのコンポーネントは表示されません。境界。これはcontentPanesにJLabelsを使用しないようにする理由の1つです(保持するコンポーネントに基づいて優先サイズを設定しないこともあります)。代わりに、一般的にJPanelのpaintComponentメソッドで描画を行います。

サイド勧告:

  • あなたはあまりにも多くの主要な方法で起こっている - このプログラムは、デモの目的以外の目的ではない場合を除き
  • あなたがたJFrameのオリジナルのcontentPaneを設定する(JPanelの) FlowLayoutに渡しますが、一度contentPaneを変更すると意味がないことを理解してください。
  • contentPaneがFlowLayoutを使用すると仮定しても、図面JPanelをBorderLayout位置に追加しようとしています。これは意味をなさないものです。
  • あなたは空のキャッチブロックを持っています。
  • イメージをファイルではなくリソースとして取得します。
  • アブソリュートファイルパスを使用しないで、リソースへの相対パスの使用を推奨します。
  • 回避できる場合は、サイズを設定しないでください。
  • g.fillRect(50,50,450,650);など、いわゆる「マジックナンバー」は避けてください。これにより、コードのデバッグと拡張が難しくなります。たとえば、

、のようなもの:

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class ShowRectangle extends JPanel { 
    private static final int RECT_X = 50; 
    private static final int RECT_Y = RECT_X; 
    private static final int RECT_W = 200; 
    private static final int RECT_H = 200; 
    private static final String URL_SPEC = "https://duke.kenai.com/guitar/DukeAsKeith-daylightSmall.png"; 
    private BufferedImage img; 

    public ShowRectangle(BufferedImage img) { 
     this.img = img; 
    } 

    // have same JPanel draw image and graphic element 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (img != null) { 
      g.drawImage(img, 0, 0, this); 
     } 

     // avoid magic numbers 
     // g.fillRect(50,50,450,650); 
     g.fillRect(RECT_X, RECT_Y, RECT_W, RECT_H); 
    } 

    // Size the JPanel to the image size 
    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet() || img == null) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(img.getWidth(), img.getHeight()); 
    } 

    private static void createAndShowGui(BufferedImage image) { 
     ShowRectangle mainPanel = new ShowRectangle(image); 

     JFrame frame = new JFrame("ShowRectangle"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 

     try { 
      URL imageUrl = new URL(URL_SPEC); 
      BufferedImage img = ImageIO.read(imageUrl); 
      SwingUtilities.invokeLater(() -> createAndShowGui(img)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      System.exit(-1); 
     } 
    } 
} 

あなたは、例えば、「マジック」の数字を使用しないようならば、それは現在の変数の値によって描画されているので、それは、黒い長方形をドラッグ可能にするために簡単です、値MouseAdapter(MouseListenerとMouseMotionListenerを組み合わせたもの)の内部で変更することができます。例:

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.URL; 

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

@SuppressWarnings("serial") 
public class ShowRectangle extends JPanel { 
    private static final int RECT_X = 50; 
    private static final int RECT_Y = RECT_X; 
    private static final int RECT_W = 200; 
    private static final int RECT_H = 200; 
    private static final String URL_SPEC = "https://duke.kenai.com/guitar/DukeAsKeith-daylightSmall.png"; 
    private int rectX = RECT_X; 
    private int rectY = RECT_Y; 
    private BufferedImage img; 

    public ShowRectangle(BufferedImage img) { 
     this.img = img; 
     MouseAdapter myMouse = new MyMouse(); 
     addMouseListener(myMouse); 
     addMouseMotionListener(myMouse); 
    } 

    // have same JPanel draw image and graphic element 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (img != null) { 
      g.drawImage(img, 0, 0, this); 
     } 

     // avoid magic numbers 
     // g.fillRect(50,50,450,650); 
     g.fillRect(rectX, rectY, RECT_W, RECT_H); 
    } 

    // Size the JPanel to the image size 
    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet() || img == null) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(img.getWidth(), img.getHeight()); 
    } 

    private class MyMouse extends MouseAdapter { 
     private Point p1; 
     private Point rectP = null; 

     @Override 
     public void mousePressed(MouseEvent e) { 
      p1 = e.getPoint(); 
      if (new Rectangle(rectX, rectY, RECT_W, RECT_H).contains(p1)) { 
       rectP = new Point(rectX, rectY); 
      } 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      moveRect(e.getPoint()); 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      moveRect(e.getPoint()); 
      rectP = null; 
     } 

     private void moveRect(Point p2) { 
      if (rectP == null) { 
       return; 
      } 
      rectX = rectP.x + p2.x - p1.x; 
      rectY = rectP.y + p2.y - p1.y; 
      repaint(); 
     } 

    } 

    private static void createAndShowGui(BufferedImage image) { 
     ShowRectangle mainPanel = new ShowRectangle(image); 

     JFrame frame = new JFrame("ShowRectangle"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 

     try { 
      URL imageUrl = new URL(URL_SPEC); 
      BufferedImage img = ImageIO.read(imageUrl); 
      SwingUtilities.invokeLater(() -> createAndShowGui(img)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      System.exit(-1); 
     } 
    } 
} 
+0

ありがとうございました。しかし、JLabelにレイアウトをどのように追加しますか? – user3150362

+0

@ user3150362:私の意見では、あなたはしません。背景JPanelを使用したいと思います。ハングアップ..... –

+0

@ user3150362:上の例を参照してください。\ –

0

そこには境界線が外れていて、見えませんでした。

次の2行を交換し、

@Override 
      public void paintComponent(Graphics g){ 
       super.paintComponent(g); 
       Rectangle clipBounds = g.getClipBounds(); 
           System.out.println(clipBounds.getX() +" "+ clipBounds.getY() + " "+ clipBounds.getHeight() + " " + clipBounds.getWidth()); 

       g.setColor(Color.BLACK); 
       g.fillRect(0,0,450,450); 
      } 

あなたは0.0 0.0 10.0 10を取得します、これを試してみてください

g.setColor(Color.BLACK); 
g.fillRect(0,0,250,250); 

をご確認ください。1として

frame.setLayout(new GridLayout()); 
     frame.add(new JPanel(new GridLayout()){ 
      /** 
      * 
      */ 
      private static final long serialVersionUID = 1L; 

      @Override 
      public void paintComponent(Graphics g){ 
       super.paintComponent(g); 
       Rectangle clipBounds = g.getClipBounds(); 
       System.out.println(clipBounds.getX() +" "+ clipBounds.getY() + " "+ clipBounds.getHeight() + " " + clipBounds.getWidth()); 
       g.setColor(Color.BLACK); 
            g.fillRect(frame.getWidth()/2,0,frame.getWidth(),frame.getWidth()); 

      } 
     }, BorderLayout.CENTER); 

、フィルreactangleコンテナを意味し、出力として0 は10,10まで0,0から始めているので、それはあなたの問題を解決します)

変更にのGridLayout(へのレイアウトを示していませんでしたDOC、

空隙java.awt.Graphics.fillRect(int型のx、int型のY、INT幅、INT高さ)

は、指定された矩形を塗りつぶし。矩形の左端と右端はxとx + width - 1にあります。上端と下端はyとy + height-1にあります。結果の長方形は幅がピクセル、高さがピクセルの領域幅をカバーします。矩形は、グラフィックスコンテキストの現在の色を使用して塗りつぶされます。 パラメータ: x塗りつぶす矩形のx座標。 y塗りつぶす矩形のy座標。 width塗りつぶす矩形の幅。 height塗りつぶす矩形の高さ。

これは問題です

+0

ありがとう!問題はありますが、jframeの1/2を占めるのではなく、小さな黒い四角形として表示されるのはなぜですか? – user3150362

+0

ここに問題があり、画像が表示されない – user3150362

関連する問題