窗口中的Java JFrame矩形

时间:2018-01-17 22:42:19

标签: java swing jframe

所以我试图使用JFrame将Rectangle2D.Float放在窗口中,但是当我编译代码时,我只得到没有矩形的空白窗口。你们可以看看它并告诉我我做错了什么吗?

package zestaw8;

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

class Plansza85 extends JPanel
{
   Shape figura;
   Plansza85(Shape figura)            
   {                                
      this.figura=figura;
   }                                
}

public class Zestaw8_cw85 
{
    public static void main(String[] args)                
   {                                                     
      Shape obj1;                                        
      obj1=new Rectangle2D.Float(100,100,140,140);      

      zestaw8.Plansza85 p;                                         
      p=new zestaw8.Plansza85(obj1);

      JFrame jf=new JFrame();                            
      jf.setTitle("Plansza p");                       
      jf.setSize(400,400);                               
      jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      jf.setVisible(true);
      jf.add(p);
   }
}

2 个答案:

答案 0 :(得分:3)

你似乎对Swing中的绘画效果有误解。

首先查看Performing Custom PaintingPainting in Swing2D GraphicsRectangle2D是一个图形基元,需要通过普通的自定义绘制过程进行绘制

根据Performing Custom Painting的常见建议,您应该覆盖paintComponent的{​​{1}}方法并通过Plansza85 API绘制Shape,类似于...

Painted

Graphics2D

例如。

我还覆盖了import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Shape; import java.awt.geom.Rectangle2D; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class Test { public static void main(String[] args) { new Test(); } public Test() { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { Shape obj1; obj1 = new Rectangle2D.Float(100, 100, 140, 140); Plansza85 p; p = new Plansza85(obj1); JFrame jf = new JFrame(); jf.setTitle("Plansza p"); jf.add(p); jf.pack(); jf.setLocationRelativeTo(null); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setVisible(true); } }); } class Plansza85 extends JPanel { Shape figura; Plansza85(Shape figura) { this.figura = figura; } @Override public Dimension getPreferredSize() { if (figura == null) { return super.getPreferredSize(); } Rectangle2D bounds = figura.getBounds2D(); double width = bounds.getMaxX(); double height = bounds.getMaxY(); return new Dimension((int)width + 1, (int)height + 1); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); g2d.setColor(getForeground()); g2d.draw(figura); g2d.dispose(); } } } 方法,根据形状的大小为组件生成适当的大小提示,我之所以这样做,是因为我不喜欢猜测工作,窗口也是包括可变大小的边框和标题栏,如果您只依赖getPreferredSize

,它们将更改面板的大小

答案 1 :(得分:0)

您需要覆盖paintComponent

Plansza85方法
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

class Plansza85 extends JPanel {
    private Shape figura;

    Plansza85(Shape figura) {
        this.figura = figura;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.draw(figura);
    }
}

public class Zestaw8_cw85 {
    public static void main(String[] args) {
        Shape obj1;
        obj1 = new Rectangle2D.Float(100, 100, 140, 140);

        Plansza85 p;
        p = new Plansza85(obj1);

        JFrame jf = new JFrame();
        jf.setTitle("Plansza p");
        jf.setSize(400, 400);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.add(p);
        jf.setVisible(true);
    }
}

希望有所帮助!