NetBeans面板设计



我正在使用JPanelsJFrames做一个项目,在那里我要创建一个面板,上面写着"欢迎来到目标",以及定位在消息下面的目标标志。我拥有的类是Main、TargetLogoPanel和TargetLogoUI。我试着搞乱Netbeans 7.1中实现的设计函数,但无法找到以这种方式绘制椭圆的方法,所以这是我添加的代码:

@Override
protected void paintComponent(Graphics g) {
    g.setColor(Color.red);
    g.fillOval(((targetPanel.getWidth()) / 2) - 100,
            ((targetPanel.getHeight()) / 2) - 100, 200, 200);
    g.setColor(Color.WHITE);
    g.fillOval(((targetPanel.getWidth()) / 2) - 65,
            ((targetPanel.getHeight()) / 2) - 65, 130, 130);
    g.setColor(Color.red);
    g.fillOval(((targetPanel.getWidth()) / 2) - 30,
            ((targetPanel.getHeight()) / 2) - 30, 60, 60);
}

徽标宽度为200像素,在调整框架大小时保持在中间。然而,仅根据我所添加的内容,在程序运行时不会绘制圆圈。在我的主要方法中,我把new TargetLogoUI().setVisible(true);我到底做错了什么?

您提供的代码片段存在许多问题。

  • 你依赖于硬(魔术)数字。虽然有时这是有效的,但这是一个危险的做法,您应该尽量避免
  • 您似乎没有向父容器布局管理器提供任何大小提示,这通常意味着您的组件将向布局管理器请求0x0空间。
  • 你没有调用super.paintComponent,这是确保组件正确绘制所需的。
  • 您依赖于来自外部资源的信息来尝试定位容器。这不是paint的工作,这是布局管理器的工作。

这些只是我们从你的代码片段中看到的东西,可能还有其他问题。

public class Target {
    public static void main(String[] args) {
        new Target();
    }
    public Target() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }
                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
    public class TestPane extends JPanel {
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            int width = getWidth();
            int height = getHeight();
            int radius = Math.min(width, height);
            g.setColor(Color.red);
            g.fillOval(
                    (int)((radius / 2) - (radius * 0.5)),
                    (int)((radius / 2) - (radius * 0.5)), 
                    (int)radius, 
                    (int)radius);
            g.setColor(Color.WHITE);
            g.fillOval(
                    (int)((radius / 2) - (radius * 0.325)),
                    (int)((radius / 2) - (radius * 0.325)), 
                    (int)(radius * 0.65), 
                    (int)(radius * 0.65));
            g.setColor(Color.red);
            g.fillOval(
                    (int)((radius / 2) - (radius * 0.15)),
                    (int)((radius / 2) - (radius * 0.15)), 
                    (int)(radius * 0.3), 
                    (int)(radius * 0.3));
        }
    }
}

我在google上搜索一个靶心,看到了这个例子。我提供了修改后的JPanel如下:

我设置了rings = 3,并在paintComponent()中翻转了红/白

class Bullseye extends JPanel {
  static final int SIZE = 300; // initial window size
  int rings = 3; // Number of rings to draw in bullseye
  public Bullseye() {
    this.setBackground(Color.white);
    this.setPreferredSize(new Dimension(SIZE, SIZE));
  }
  public void setRings(int r) {
    rings = r;
    this.repaint(); // new value of rings - better repaint
  }
  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    // x,y coordinate of top left corner for drawing circles
    int x = SIZE / 2;
    int y = SIZE / 2;
    for (int i = rings; i > 0; i--) {
      if (i % 2 == 0)
        g.setColor(Color.white);
      else
        g.setColor(Color.red);
      int radius = i * 100 / rings; // compute radius of this ring
      g.fillOval(x - radius, y - radius, radius * 2, radius * 2);
    }
  }
}

相关内容

  • 没有找到相关文章

最新更新