java JFrame graphics

后端 未结 2 550
北海茫月
北海茫月 2020-12-11 10:15

I have the following simple code in a JFrame constructor

    super(name);
    setBounds(0,0,1100,750);
    setLayout(null);


    setVisible(true);

    g =          


        
相关标签:
2条回答
  • 2020-12-11 10:45

    You should better override paint(Graphics g) or paintComponent(Graphics g) than the approach you are trying. Add the lines below and remove the lines after setVisible in your code.

    public void paint(Graphics g) {
      int[] x =new int[]{65,  122,  77,  20};
      int[] y =new int[]{226,  258, 341,  310};
      g.setColor(Color.RED);  
      g.drawPolygon (x, y, x.length);
    }
    
    0 讨论(0)
  • 2020-12-11 10:54
    • Dont overridepaint(..) in JFrame

    • Rather add custom JPanel with overridden paintComponent(Graphics g) to JFrame

    • Dont use Null/AbsoluteLayout use an appropriate LayoutManager

    • Dont call setBounds(..) on JFrame instance (not that its not allowed but cant see it being relevant in this application)

    • Dont forget to use EDT for creating and changing GUI components:

      javax.swing.SwingUtilities.invokeLater(new Runnable() {
                  @Override
                 public void run() {
                      Test test = new Test();
                 }
      });
      

    you would then do something like this:

    public class Test {
    
        /**
         * Default constructor for Test.class
         */
        public Test() {
            initComponents();
        }
    
        public static void main(String[] args) {
    
            /**
             * Create GUI and components on Event-Dispatch-Thread
             */
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    Test test = new Test();
                }
            });
        }
    
        /**
         * Initialize GUI and components (including ActionListeners etc)
         */
        private void initComponents() {
            JFrame jFrame = new JFrame();
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            jFrame.add(new MyPanel());
    
            //pack frame (size JFrame to match preferred sizes of added components and set visible
            jFrame.pack();
            jFrame.setVisible(true);
        }
    }
    
    class MyPanel extends JPanel {
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            int[] x = new int[]{65, 122, 77, 20};
            int[] y = new int[]{226, 258, 341, 310};
            g.setColor(Color.RED);
            g.drawPolygon(x, y, x.length);
        }
    
        //so our panel is the corerct size when pack() is called on Jframe
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }
    }
    

    which produces:

    enter image description here

    0 讨论(0)
提交回复
热议问题