窗口中的Java 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); } } 

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

首先看一下执行自定义绘画 , 在swing和2D图形中 绘画 。 Rectangle2D是一个图形基元,需要通过普通的自定义绘制过程进行绘制

根据Performing Custom Painting的常见建议,你应该覆盖Plansza85paintComponent方法,并通过Graphics2D API绘制Shape ,比如……

绘

 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方法,根据形状的大小为组件生成一个合适的大小提示,我这样做是因为我不喜欢猜测工作,窗口还包括可变大小的边框和标题栏,这将改变如果您只依赖setSize调整面板的大小

您需要覆盖Plansza85paintComponent方法

 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); } } 

希望能帮助到你!