【问题标题】:add different jcomponents to jframe in java在java中将不同的jcomponents添加到jframe
【发布时间】:2015-04-24 14:18:17
【问题描述】:

我想在一个 JPanel 中绘制一些不同的 JComponent。我用不同的绘制方法创建了一些 JComponents。然后在 main 中创建对象并将它们放到 JFrame 中。 我的问题是,只有最后一个对象被绘制在窗口中。

如何在窗口中放置不同的 JComponent,而不删除或重新绘制旧的?

(Model2 和 Model1 一样,只是paintComponent 有点不同)

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GuiModel{  
    public static void main(String[] args){         
        JFrame frame = new JFrame();        
        frame.setSize(600, 600);
        frame.setLocation(150, 150);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);                 

        frame.getContentPane().add(new Model1(0,0));
        frame.getContentPane().add(new Model2(25,37,true));             

    }
}
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;    
public class Model1 extends JComponent {
    private int xPos, yPos;


    Model1 (int x, int y){
        this.xPos = x;
        this.yPos = y;
    }

    @Override
    protected void paintComponent(Graphics g) {     
        g.setColor(Color.BLACK);
        g.drawOval(xPos, yPos, 5, 5);                   
    }
}

【问题讨论】:

    标签: java swing jframe paintcomponent jcomponent


    【解决方案1】:

    进行自定义绘画时:

    1. 您需要覆盖组件的getPreferredSize() 方法以返回组件的大小,以便布局管理器可以显示该组件。现在你的组件的大小是 (0, 0) 所以没有什么可以画的。

    2. 组件的绘制是从 (0, 0) 而不是 (x, y) 完成的。然后,如果您将组件定位在面板上的特定点,您可以使用 setLocation(x, y) 告诉 Swing 在哪里绘制组件。

    3. 如果要在随机位置绘制组件,则还需要在面板上使用空布局,并且还必须设置组件的大小。要设置组件的大小,您可以在构造函数中使用 setSize(getPreferredSize())。

    所以你的 Model1 类看起来像:

    public class Model1 extends JComponent {
        //private int xPos, yPos;
    
        Model1 (int x, int y){
            //this.xPos = x;
            //this.yPos = y;
            setLocation(x, y);
            setSize( getPreferredSize() );
        }
    
        @Override
        public Dimension getPreferredSize()
        {
            return new Dimension(5, 5);
        }
        @Override
        protected void paintComponent(Graphics g) {     
            g.setColor(Color.BLACK);
            //g.drawOval(xPos, yPos, 5, 5);                   
            g.drawOval(0, 0, 5, 5);                   
        }
    }
    

    【讨论】:

      【解决方案2】:

      JFrame 默认使用BorderLayout。在不指定约束的情况下添加组件时,每个组件将被放置在CENTER

      要么指定约束条件,要么如果BorderLayout 不适合您,请切换到另一个布局。

      添加约束:

      frame.add(new Model1(0,0), BorderLayout.NORTH);
      

      我建议阅读How to use BorderLayout,以及guides on the other predefined layouts。此外,如果 JDK 提供的布局都不符合您的需求,请随时在线查找第 3 方布局。或者,如果没有适合您需求的布局,您可以创建自己的 LayoutManager


      我还建议使用pack()根据内部组件调整框架的大小,而不是使用frame.setSize 来设置它的大小。这可确保您的框架紧紧地包裹在其中的任何东西上,不留空白。如果你想要空格,应该由布局管理器处理

      【讨论】:

        【解决方案3】:

        您可以指定组件的大小或使用布局将对象放置在一个位置之外。或者您可以创建 Graphics 的副本并在其中写入:

        protected void paintComponent(Graphics g) {
            g = g.create();
            g.setColor(Color.BLACK);
            g.drawOval(xPos, yPos, 5, 5);
            g.dispose();
        }
        

        但最后一个变体效率不高:它会在每次重绘时复制 Graphics。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-09-06
          • 2017-08-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多