图形不绘制/露面(Graphics Not Drawn/Appearing)

2019-10-17 08:02发布

我有这个问题在那里,我已经绘制的对象并不在GUI中出现。 我知道它被处理,因为数据是被推到一个日志文件。 但是,图形没有出现。

下面是一些我的代码:

public static void main(String[] args)
{
   JFrame window = new JFrame();
   window.setLayout(new BorderLayout());
   window.setVisible(true);
}

有一个按钮,我已经在这里和那里放置一些其他的小部件。 中间的窗格(BorderLayout.CENTER)是我的DrawnObject是要显示。

// Called when button is pushed/clicked
public static void trigger()
{
   DrawnObject shape = new DrawnObject();
   window.setLayout(new BorderLayout());
   window.getContentPane().add(shape, BorderLayout.CENTER);
   window.pack;
}

public class DrawnObject extends JComponent()
{
   @Override
   public Dimension getMinimumSize()
   {
       return new Dimension(100, 100);
   }

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

   @Override
   public Dimension getMaximumSize()
   {
       return new Dimension(700, 700);
   }

   @Override
   public void paintComponent(Graphics g)
   {
      super.paintComponent(g);
      g.setColor(Color.RED);
      g.fillRect(10, 10, 10, 10);
   }
}

我试过铸造Graphics对象Graphics2D和使用适当的绘画方法,但是这并没有帮助。

Answer 1:

尝试改变颜色......

super.paintComponent(g);
g.setColor(Color.RED);
g.fillRect(10, 10, 10, 10);

图形上下文颜色设置为默认的组件的背景颜色

public class PaintTest01 {

    public static void main(String[] args) {
        new PaintTest01();
    }

    public PaintTest01() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new DrawPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class DrawPane extends JPanel {

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

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.fillRect(10, 10, 10, 10);
        }
    }
}

更新

从你的问题你更新的代码,它不能编译...

您创建JFrame的构造函数,它是一个局部变量命名的窗口...

public static void main(String[] args)
{
   JFrame window = new JFrame();
   window.setLayout(new BorderLayout());
   window.setVisible(true);
}

然后尝试和增加DrawObject到窗口...

public static void trigger()
{
   DrawnObject shape = new DrawnObject();
   window.setLayout(new BorderLayout());
   window.getContentPane().add(shape, BorderLayout.CENTER);
   window.pack;
}

但由于window是不确定的,例如你不能编译。

这将汇编的唯一方法是,如果你在被称为一流水平有一个静态变量window ,其中在这种情况下,应该产生一个NullPointerException ,除非你初始化变量

public class MyDrawing {
    public static JFrame window = new JFrame();

这意味着你有两个框架,一个你在构造函数中创建和一个你创建的静态水平类字段。 这是行不通的,因为它们是不同的情况下,



Answer 2:

  • 必须返回从公共类DrawnObject扩展JComponent的()PREFERREDSIZE,否则返回Dimension(0, 0);

  • Top-Level containers已经得到落实BorderLayout ,然后window.add(shape, BorderLayout.CENTER); 是正确的代码行和JComponent应正确奠定

  • 使用pack()代替invalidate()该代码行不工作,调用一些由集装箱奠定BorderLayoutGridLayout (EI ???),也不是基于容器JComponentJComponent还没有实现任何LayoutManagerAPI ,不得不返回PreferredSize

  • 为更好地帮助越早张贴SSCCE



Answer 3:

尝试添加您的DrawnObject到windows内容窗格,也不要忘记设置的布局。 使用空布局是不好的做法(如果您对无效打电话给你的布局设置为null)。

window.getContentPane().setLayout(new BorderLayout());
window.getContentPane().add(shape, BorderLayout.CENTER);
window.pack();
window.setVisible(true);

另外,尽量跳过invalidate()



文章来源: Graphics Not Drawn/Appearing