【问题标题】:Not showing graphics in JPanel which is added to another JPanel在添加到另一个 JPanel 的 JPanel 中不显示图形
【发布时间】:2012-07-07 17:48:13
【问题描述】:

将具有图形的JPanel 添加到JFrame 时,它工作正常。但是当我尝试添加一个JPanel 并在其中添加了另一个带有图形的JPanel 时,它没有显示在JFrame 中。请看下面的代码

package sample;

import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JFrame{
    public static void main(String[] args) {
        new Main();
    }

    public Main(){
        setTitle("Sample");
        setVisible(true);
        setSize(500,500);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        add(new SamplePanel2());
    }
}

class SamplePanel2 extends JPanel{
    public SamplePanel2(){
        add(new JButton("Hi"));
        add(new SamplePanel());
    }
}
class SamplePanel extends JPanel {
    public SamplePanel(){
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString("HHHHHHHHHHHH", 100, 100);
    }
}

【问题讨论】:

  • 只需覆盖 getPreferredSize() 并使其返回一些值,例如 return new Dimension(300, 300);,在您的 SamplePanel Class
  • 请参阅“如何将 JPanel 类添加到 netbeans 中的 JFrame 表单类中?”在 stackoverflow 上了解更多信息
  • @MaVRoSCy : 伙计,你只是忘了放评论的链接,就像为了在这里发表评论,把方括号 [] 放在这里,就像 [这里] 后面跟着括号,就像 [ here]() 并在括号内粘贴 URL。

标签: java swing jpanel paintcomponent


【解决方案1】:

请注意Main 类的构造函数,让它成为你的习惯,按照本例所示的顺序进行操作。首先将组件添加到JFrame,然后只调用pack(), setSize() or setVisible(...),而不是在此之前。

始终把它作为你的习惯,每当你重写 paintcomponent() 方法时,也要重写 getPreferredSize() 方法。

并且始终将pack()/setVisible(...) 之类的调用放在 EDT - 事件调度线程中。请阅读Concurrency in Swing,了解有关该主题的更多详细信息。

import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JFrame{
    public static void main(String[] args) {
        new Main();
    }

    public Main(){
        setTitle("Sample");        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setContentPane(new SamplePanel2());
        pack();        
        setVisible(true);
    }
}

class SamplePanel2 extends JPanel{
    public SamplePanel2(){
        add(new JButton("Hi"));
        add(new SamplePanel());
    }
}
class SamplePanel extends JPanel {
    public SamplePanel(){
    }

    @Override
    public Dimension getPreferredSize()
    {
        return (new Dimension(300, 300));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString("HHHHHHHHHHHH", 100, 100);
    }
}

【讨论】:

  • @user1508907:注意JPanel的默认布局是FlowLayout
  • 你很受欢迎并保持微笑:-)
猜你喜欢
  • 1970-01-01
  • 2021-01-29
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多