当前位置: 首页 > 知识库问答 >
问题:

用JPanel.paintComponent()-错误的大小绘制两个正方形

施誉
2023-03-14

我试图绘制两个定义大小的正方形,一个位于一行中的另一个旁边,使用JPanel的画图组件()方法。到目前为止,我尝试的是:

1.边框布局

我试图在JPanel的一个单独的子类中绘制每个正方形,然后将这些JPanel添加到JFrame中。

结果:正方形被压扁到JPanel的相对两侧:高度与预期一致,但宽度最小。

JFrame frame = new JFrame();

GreenPanel greenPanel = new GreenPanel();
frame.getContentPane().add(BorderLayout.WEST, greenPanel);
BluePanel bluePanel = new BluePanel();
frame.getContentPane().add(BorderLayout.EAST, bluePanel);

frame.setSize(500, 350);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

class GreenPanel extends JPanel {         
    public void paintComponent(Graphics g) {
        g.setColor(Color.GREEN);
        g.fillRect(0, 0, 100, 100);
    }
}

class BluePanel extends JPanel {         
    public void paintComponent(Graphics g) {
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, 100, 100);
    }
}

2.流程布局

我试图将我的带有绘制方块的“子”JPanels添加到“父”JPane,然后调用JFrame.setContentPane(JPanel)。

结果:正方形被画在顶部中心区域作为小正方形。

JFrame frame = new JFrame();
JPanel outerPanel = new JPanel();
frame.setContentPane(outerPanel);

GreenPanel greenPanel = new GreenPanel();
outerPanel.add(greenPanel);
BluePanel bluePanel = new BluePanel();
outerPanel.add(bluePanel);

frame.setSize(500, 350);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

class GreenPanel extends JPanel {         
    public void paintComponent(Graphics g) {
        g.setColor(Color.GREEN);
        g.fillRect(0, 0, 100, 100);
    }
}

class BluePanel extends JPanel {         
    public void paintComponent(Graphics g) {
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, 100, 100);
    }
}

我做错了什么?有没有什么方法可以迫使布局管理器尊重绘制的像素的大小?

共有1个答案

琴镜
2023-03-14

进行以下更改。解释见评论。

  JFrame frame = new JFrame();
  //add layout manager. You can achieve the desired layout 
  //with GridLayout, Box layout and others 
  frame.getContentPane().setLayout(new GridLayout(1,2));
  GreenPanel greenPanel = new GreenPanel();
  //set preferred size to the panel 
  greenPanel.setPreferredSize(new Dimension(100,100));
  frame.add(greenPanel);
  BluePanel bluePanel = new BluePanel();
  //set preferred size to the panel 
  bluePanel.setPreferredSize(new Dimension(100,100));
  frame.getContentPane().add(bluePanel);

  //let the frame adapt to the panels size 
  //frame.setSize(500, 350); 
  frame.validate();
  frame.pack();
  frame.setVisible(true);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

如果需要,请随时要求澄清。


(顺便说一句,实际上不需要覆盖paintComponent(图形g)。您可以简单地为每个JPanel)设置首选的大小和颜色

 类似资料:
  • 本文向大家介绍C#正方形图片的绘制方法,包括了C#正方形图片的绘制方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C#绘制正方形图片的的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 问题内容: 现在,我可以比较X和Y以检查是否发生碰撞,但这仅是两个对象在完全相同的X和Y位置彼此正确通过时。我需要更精确地检查碰撞,以检查是否有刮痕,因为缺少更好的术语。我有X,Y,X和Y比例的变量以及X和Y的速度。非常感谢您的帮助:D 编辑:正方形! 问题答案: 如果您的正方形无法旋转,这很简单:说是每个边的长度,一个正方形的中心,另一个正方形的中心。然后: 更复杂的情况是正方形是否可以旋转。在

  • 问题内容: 如何更改用matplotlib绘制的图形的大小? 问题答案: 如果你已经创建了图形,则可以快速执行以下操作: 要将大小更改传播到现有的窗口,请添加

  • 我必须在正方形上画一个三角形,带星号,预期输出如下图所示。 指令是这样的:编写一个C程序,从用户那里读取一个数字n,并允许使用“*”字符打印一个带有屋顶的房子。房子应该是一个n×n正方形和屋顶两条45度的对角线形成屋顶(如果n是奇数,屋顶在顶部完美地关闭)。我创建了一个三角形和正方形,但我不能把它们结合起来。三角形

  • 这是我的shape_two文件,我把它放进了我的drawable文件夹。 我的问题是,当我在我的ImageViews上绘制形状时,它会被重新调整大小(改变高度和宽度)。我有不同大小的imageView和我想使用单一形状的xml绘制边框,我的imageView大小不应该改变,而这样做。谁都可以告诉我如何实现它。 在搜索了很多东西后,我才知道,我不能对它执行位图操作来根据形状重新调整它的大小,因为xm

  • 我使用Spring Boot,可以发送小于1MB的图像,但当我使用大于1MB的大图像发出post请求时,会出现以下错误: 下面是我尝试的所有application.properties配置: 1 2 我还研究了在web.xml文件中更改Tomcat允许的请求大小,但我没有web.xml文件。我正在使用的Tomcat绑定到应用程序中。