2

JPanelで長方形を描画しようとしていますが、表示されません。ただし、フレームでは機能します。

コメントを外した場合//frame.getContentPane().add(rect); //フレームとコメントにある場合は描画しますframe.getContentPane()。add(panel); //ただし、パネルには長方形が描画されません。

助けてくれてありがとう。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class DrawingRect{

    public static void main(String[] args) {
        DrawingRect d = new DrawingRect();
    }

  public DrawingRect(){

     JFrame frame = new JFrame("Drawing a rect");
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setPreferredSize(new Dimension (500,500));

     Rect rect = new Rect();

     JPanel panel = new JPanel();
     panel.setPreferredSize(new Dimension (500,500));
     panel.setVisible(true);

     panel.add(rect);

    //frame.getContentPane().add(rect); //Will draw if its in the frame
    frame.getContentPane().add(panel); // but not in the panel


     frame.pack();
     frame.setVisible(true);  



     panel.repaint();
     frame.repaint();



  }

  public class Rect extends JComponent{

    private static final long serialVersionUID = 1L;

        public void paint(Graphics g)
        {
            g.setColor(Color.black);
            g.drawRoundRect(10, 10, 100, 100, 20, 20);  
        }
    }

}
4

1 に答える 1

4

あなたのRectはうまく描画されていますが、非常に小さいです!私が何を意味するかを確認するには、レンダリング後のサイズを表示します。

  Rect rect = new Rect();
  rect.setBorder(BorderFactory.createTitledBorder("rect"));

  JPanel panel = new JPanel();
  panel.setPreferredSize(new Dimension(500, 500));
  panel.setVisible(true);

  panel.add(rect);

  // frame.getContentPane().add(rect); //Will draw if its in the frame
  frame.getContentPane().add(panel); // but not in the panel

  frame.pack();
  frame.setVisible(true);

  System.out.println(rect.getSize());

次のようなものが表示されます。

java.awt.Dimension[width=1,height=1]

つまり、1ピクセル×1ピクセルで、小さすぎて見えません。

解決策は、適切なレイアウトを使用し、表示されるように適切なサイズを指定することです。例えば、

   public class Rect extends JComponent {

      private static final long serialVersionUID = 1L;
      private static final int PREF_W = 150;
      private static final int PREF_H = 150;

      @Override
      // public void paint(Graphics g) {
      protected void paintComponent(Graphics g) {
         super.paintComponent(g);
         g.setColor(Color.black);
         g.drawRoundRect(10, 10, 100, 100, 20, 20);
      }

      @Override
      public Dimension getPreferredSize() {
         return new Dimension(PREF_W, PREF_H);
      }
   }

また、paintメソッドではなく、JComponentのpaintComponentメソッドを使用して描画します。

于 2012-04-13T02:01:10.020 に答える