如何在不覆盖JFrame的情况下将JPanel图形添加到JFrame

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在不覆盖JFrame的情况下将JPanel图形添加到JFrame相关的知识,希望对你有一定的参考价值。

我正在尝试将一个小龙卷风图形(颠倒的金字塔)添加到我的框架中。我可以通过在主方法中将它添加到框架中来获得龙卷风但是当我这样做时,我看到的只是龙卷风图形而不是它下面的GUI。

所以,我现在正试图在createComponents方法中创建时将Tornado图形添加到框架中,但它现在根本没有出现。相反,我只能在框架中看到GUI。

我可能错过了一些简单的东西,但我似乎无法弄明白。我不确定我需要做什么才能让GUI和龙卷风图形都出现。

    public class EFScaleViewer {

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            TornadoFrame frame = new TornadoFrame();

            frame.setTitle("EF Scale");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);  
        }
}

这是我创建框架的地方,我正在尝试添加龙卷风:

public class TornadoFrame extends JFrame{

    private JButton submit;
    private JLabel label;
    static JLabel errorLabel;
    static JTextField textBox;   
    JPanel tornado = new TornadoComponent();

    private static final int FRAME_WIDTH = 400;
    private static final int FRAME_HEIGHT = 300;

    //Constructor for the frame 
    public TornadoFrame() {
        super();
        setSize(FRAME_WIDTH, FRAME_HEIGHT);
        createComponents();
    }

    private void createComponents()
       {
          textBox = new JTextField("    "); 
          submit = new JButton("Submit");
          label = new JLabel("Please enter a windspeed:");
          errorLabel = new JLabel("Error Message " );

          JPanel panel = new JPanel();
          panel.add(label);
          panel.add(textBox);
          panel.add(submit);

         panel.add(errorLabel);   
         panel.add(tornado);
         add(panel);
       }    
}

我知道这是有效的,但我可能会遗漏一些东西所以这里是我创造龙卷风的地方:

public class TornadoComponent extends JPanel {
    public void paintComponent(Graphics g) {
        int[] xPoints = {100,200,0};
        int[] yPoints = {0,200,200};
        int nPoints = 3;

        g.drawPolygon(xPoints, yPoints, nPoints);

    }
}
答案

您必须为其设置JPanels大小才能显示Graphics。

static class TornadoComponent extends JPanel {

    public TornadoComponent() {
        setPreferredSize(new Dimension(500, 500));
    }

    @Override
    public void paintComponent(Graphics g) {
        //Whatever
    }
}

并且为了触发paintComponent(Graphics g),你必须在tornado.repaint();函数的末尾添加createComponents()

private void createComponents() {
    //All your components
    panel.add(tornado);
    add(panel);
    tornado.repaint();
}

现在显示多边形但不在正确的位置(稍微偏离图像)

因此我们必须安排你的JPanels:

    private void createComponents() {
        textBox = new JTextField("    ");
        submit = new JButton("Submit");
        label = new JLabel("Please enter a windspeed:");
        errorLabel = new JLabel("Error Message " );

        JPanel upper = new JPanel();
        upper.setLayout(new BoxLayout(upper,BoxLayout.X_AXIS));
        upper.add(label);
        upper.add(textBox);
        upper.add(submit);
        upper.add(errorLabel);
        JPanel lower = new JPanel();
        lower.setLayout(new BoxLayout(lower,BoxLayout.X_AXIS));
        lower.add(tornado);
        JPanel over = new JPanel();
        over.setLayout(new BoxLayout(over,BoxLayout.Y_AXIS));
        over.add(upper);
        over.add(lower);
        add(over);
        tornado.repaint();
    }

基本上我做了一些盒子......

Over
    Upper
        ... your stuff with text
    Lower
        Our tornado

现在我们的龙卷风是错误的方式...

int[] xPoints = {100,200,150};
int[] yPoints = {0,0,150};

这是:

Tornado

我们刚创造了一个非常基本的龙卷风,并非针对任何事情:)

如果你想在以后更改龙卷风位置,你只需要回忆一下tornado.repaint();就可以了。

以上是关于如何在不覆盖JFrame的情况下将JPanel图形添加到JFrame的主要内容,如果未能解决你的问题,请参考以下文章

如何在不覆盖以前数据的情况下将数据添加到 XML 文件(C#)

如何在不覆盖数据源参数的情况下将附加参数传递给剑道模板

如何在不覆盖 ModelForm 中的字段定义的情况下将 ManyToManyField 小部件更改为 CheckboxSelectMultiple

如何在不覆盖 TTY 的情况下将密码传递给 su/sudo/ssh?

JAVA、GUI JPanel、JFrame、paintComponent、图形

在不同的图形环境中查找JFrame标题和边框的大小