【问题标题】:How to draw on subPanels created by .form?如何在 .form 创建的子面板上绘图?
【发布时间】:2013-07-15 22:49:03
【问题描述】:

我想在由 .form 创建的子面板上绘图。有一个“主面板”,其中包含三个子面板,分别命名为 panel1(top)、panel2(bottom-left) 和 panel3(bottom-right)。

现在我想在子面板“panel1”上画一些东西,但它不起作用。当我运行程序时,它只显示了三个子面板,但没有我绘制的“paintComponent()”方法。

我在这里粘贴了我的代码,谁能帮我检查一下是什么问题?非常感谢。

public class PanelDrawTest extends JFrame {
    private JPanel mainPanel;
    private JPanel panel1;
    private JPanel panel2;
    private JPanel panel3;

    public PanelDrawTest(){
       getContentPane().add(mainPanel);
       setPanel1(new MyPanel1());
    }

    public JPanel getMainPanel() {
       return mainPanel;
    }

    public JPanel getPanel1() {
       return panel1;
    }

    public void setPanel1(JPanel panel1) {
       this.panel1 = panel1;

    }

    private class MyPanel1 extends JPanel {

       public MyPanel1(){

       }
       @Override
       public void paintComponent(Graphics g){
           g.drawString("This is Panel 1",20,20);
           g.drawRect(0,200,100,200);

       }
    }

    public static void main(String args[]){
        SwingUtilities.invokeLater(new Runnable() {
           @Override
           public void run() {
               createAndShowGUI();
           }
        });
    }

    private static void createAndShowGUI() {
        PanelDrawTest frame = new PanelDrawTest();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(50, 50, 1200, 700);
        frame.setPreferredSize(new Dimension(1200,800));
        frame.pack();
        frame.setVisible(true);
    }

 }

【问题讨论】:

  • 启动“mainPanel”时,我的问题仍然存在。因为我在 GUI 设计中通过 .Form 使用 subPanel 构建 mainPanel。但是,我不知道如何在不同的子面板中绘制图形。这个例子有帮助 (stackoverflow.com/questions/8661973/…),但是子面板是在代码中构建的,而不是在 .form 中。我认为我的问题应该是如何调用 GUI .form 设计中内置的子面板。

标签: java swing jpanel draw paintcomponent


【解决方案1】:

注意:发布的代码会抛出 NullPointerException,因为 mainPanel 从未初始化。

构造函数没有将您的自定义面板添加到布局中,这就是它看不到的原因。 试试这个,你会看到你的画:

public PanelDrawTest() {
   mainPanel = new JPanel();
   getContentPane().add(mainPanel,BorderLayout.NORTH);
   panel1 = new MyPanel1();
   getContentPane().add(panel1,BorderLayout.CENTER);      
}

【讨论】:

  • 感谢您的回复。但是,在此更新中,panel1 似乎覆盖了 mainPanel(即仅显示 panel1)。我怎么能看到两个面板?或者我如何绘制和显示几个子面板?谢谢。
  • 您可以使用 IDE 来帮助您绘制布局,如果您有一个 .form 文件,我认为您会这样做。 Netbeans 有一个不错的视觉摇摆编辑器。如果你像我上面那样用直接的代码来做,你需要使用布局。 BorderLayout 允许您将组件放置在框架或面板的 NORTH、SOUTH、CENTER、EAST、WEST 位置。
【解决方案2】:

您的版本对我来说是不可运行的,但它有效:

public class PanelDrawTest extends JFrame {
  private JPanel mainPanel = new JPanel(); // I added a constructor to avoid NullPointerexception
  private JPanel panel1;
  private JPanel panel2;
  private JPanel panel3;

  public PanelDrawTest(){
    getContentPane().add(mainPanel);
    setPanel1(new MyPanel1());
    add(panel1); // and I added the panel
  }

  public JPanel getMainPanel() {
     return mainPanel;
  }

  public JPanel getPanel1() {
    return panel1;
  }

  public void setPanel1(JPanel panel1) {
    this.panel1 = panel1;

  }

  private class MyPanel1 extends JPanel {

    public MyPanel1(){

    }
    @Override
    public void paintComponent(Graphics g){
      g.drawString("This is Panel 1",20,20);
      g.drawRect(0,200,100,200);

    }
  }

  public static void main(String args[]){
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        createAndShowGUI();
      }
    });
  }

  private static void createAndShowGUI() {
    PanelDrawTest frame = new PanelDrawTest();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(50, 50, 1200, 700);
    frame.setPreferredSize(new Dimension(1200,800));
    frame.pack();
    frame.setVisible(true);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    相关资源
    最近更新 更多