【问题标题】:Why is drawing my custom JComponent on existing JPanel showing nothing?为什么在现有的 JPanel 上绘制我的自定义 JComponent 什么都不显示?
【发布时间】:2019-01-04 09:52:57
【问题描述】:

我正在尝试创建一个自定义 JComponent,它将作为自定义进度条,但是我无法让它显示在现有的 JPanel 上(它确实显示正确),不确定问题是什么。

public class JCustomProgressBar extends JComponent{

private final Dimension SIZE = new Dimension( 120, 120 );

public JCustomProgressBar() {
    super();
    this.setVisible(true);
}

int progress = 50; // temporary keeps progress at 50% for now while I debug

public void updateProgress (int progress){
    this.progress = progress;
}

 @Override
   public Dimension getPreferredSize() {
      return SIZE;
   }

 @Override
 public void paintComponent (Graphics g){
   //super.paintComponent(g);
   System.out.println("called");
   Graphics2D g2D = (Graphics2D) g.create();
   g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
   g2D.translate(this.getWidth()/2, this.getHeight()/2);
   g2D.rotate(Math.toRadians(270));
   Arc2D.Float arc = new Arc2D.Float (Arc2D.PIE);
   Ellipse2D circle = new Ellipse2D.Float(0, 0, 110, 110);
   arc.setFrameFromCenter (new Point(0,0), new Point (120, 120));
   circle.setFrameFromCenter(new Point(0,0), new Point (110, 110));
   arc.setAngleExtent(progress*360/100);
   g2D.setColor(Color.green);
   g2D.draw(arc);
   g2D.fill(arc);

   g2D.setColor(Color.gray);
   g2D.draw(circle);
   g2D.fill(circle);

   g2D.setColor(Color.black);
   g2D.rotate(Math.toRadians(90));
   g2D.setFont(new Font("Verdana", Font.PLAIN, 50));
   FontMetrics fm = g2D.getFontMetrics();
   Rectangle2D r = fm.getStringBounds(progress + "%", g);
   int x = (0 - (int) r.getWidth())/2;
   int y = (0 - (int) r.getHeight())/2 +fm.getAscent();
   g2D.drawString(progress + "%", x, y);
   g2D.dispose();
}

编辑

我在单击按钮时调用我的 draw 方法,因此(完美运行并正确绘制我的 JPanel)。

/**Called when a button created using createButton() is clicked. This method 
should return true if it handled the click event, and false if the click 
should be passed on to the parent.

Overrides: onButtonClick(...) in GuiScreen*/


@Override
protected boolean onButtonClick(String id) {

    if(id.equals("btnIDConfirmL")) {
        drawLeftFillProgressBar();
    }
    return false;
}

在我的 draw 方法中,我将 JPanel 添加到我的父 JPanel,为其设置边界、颜色和边框。它正确显示在屏幕上,此时一切正常,但是当我尝试添加我制作的 JComponent 时,它永远不会显示在屏幕上。我可以将另一个 JPanel 添加到我在这里制作的 JPanel 上没问题,我也可以添加一个 JLabel 也没有问题,由于某种原因,我的 JComponent 不会出现。

    private JComponent customProgressBarL;
    private JPanel backgroundPanel;

private void drawLeftFillProgressBar(){
    leftFillProgressJPanel = createPanel(this.backgroundPanel, new Rectangle(0,backgroundPanel.getHeight()/2 - (this.getPanel().getWidth()/3 - 2*10)/2, this.getPanel().getWidth()/3 - 2*10, this.getPanel().getWidth()/3 + 87));
    leftFillProgressJPanel.setBackground(Color.white);
    leftFillProgressJPanel.setBorder(BorderFactory.createLineBorder(Color.black, 1));

    customProgressBarL = new JCustomProgressBar();
    leftFillProgressJPanel.add(customProgressBarL);
    customProgressBarL.setVisible(true);
    customProgressBarL.validate();

}

我的 createPanel 方法位于我的 GuiScreen 类中,如下所示:

protected JPanel createPanel(JComponent parent, Rectangle bounds){
    JPanel panel = new JPanel();
    panel.setLayout(null);

    if(bounds != null){
        panel.setBounds(bounds);
    }
    if(parent != null){
        parent.add(panel);
    }

    return panel;
}

【问题讨论】:

  • 欢迎来到 SO。问题可能在于您将组件添加到布局中的方式。按照建议发布 mcve。
  • 对我来说很好。我只是将组件直接添加到框架中。这是测试新组件的最简单方法,因此您知道问题与布局管理器无关,因为组件的大小将适合框架的整个空间。一旦起锅,然后将其添加到将尊重组件的首选大小的面板中,以确保其正常工作。无论如何,问题肯定是如何将组件添加到面板中。

标签: java swing jpanel jcomponent


【解决方案1】:

(代表问题作者发布解决方案)

我通过在我的 draw 方法中添加以下内容解决了这个问题:结果我必须使用 setBounds 方法指定边界,以便在我将它添加到我的父 JPanel 之后,边界包含我的整个 JComponent。

    customProgressBarL = new JCustomProgressBar();
    leftFillProgressJPanel.add(customProgressBarL);

    int width = 190;
    int height = 290;

    customProgressBarL.setBounds(new Rectangle(leftFillProgressJPanel.getWidth()/2 - width/2,leftFillProgressJPanel.getHeight()/2 - height/2, width, height));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    • 2013-07-12
    • 2017-12-12
    相关资源
    最近更新 更多