【问题标题】:How do I paint to a JPanel in swing我如何在摇摆中画到 JPanel
【发布时间】:2013-03-29 05:08:23
【问题描述】:

我正在swing 中编写一个程序,它使用链接节点来存储一个值,然后以黄色条的形式将包含的值绘制到一个JPanel 中。这幅画最初是使用 AWT 完成的。我已经阅读了一些this 摇摆绘画教程,但我仍然不明白如何在 JPanel 上绘画。程序应该在按下“随机”按钮时绘制条形图,但目前什么都不画。

我已包含我认为相关的代码,但如果您需要任何其他部分,请告诉我。提前感谢您提供的任何帮助或您可以指出的任何教程。

public class DataOrganizer extends JPanel 
    {

        private JFrame  frame;

        protected static final Color DEFAULT_COLOR = Color.YELLOW;

        protected static final Color    HIGHLIGHT_COLOR = Color.YELLOW.darker();

        protected DataCollection<Item> collection; // To hold our items

        protected DataCollection<Item> sortedCollection;

        protected Item selected;

        private final int COLLECTION_SIZE = 10, // Maximum number of items
                MAXIMUM_ITEM_VALUE = 16; // Maximum value of an item

        private int firstItemXCoord;

        protected int   firstItemYCoord;

        /**
         * Launch the application.
         */
        public static void main(String[] args) 
        {
            EventQueue.invokeLater(new Runnable() {
                public void run()
                {
                    try
                    {
                        DataOrganizer window = new DataOrganizer();
                        window.frame.setVisible(true);
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            });
        }

        /**
         * Create the application.
         */
        public DataOrganizer()
        {
            initialize();

        }

        /**
         * Initialize the contents of the frame.
         */
        private void initialize()
        {
            /*
             * Create and set-up the JFrame.
             */
            frame = new JFrame();
            frame.setPreferredSize(new Dimension(550, 450));
            frame.setBounds(100, 100, 600, 400);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().setLayout(null);
            frame.setVisible(true);

            /*
             * Create btnRandom and add an action listener
             * that calls randomAction().
             */
            JButton btnRandom = new JButton("Random");
            btnRandom.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    randomAction();
                }
            });
            btnRandom.setBounds(6, 18, 117, 29);
            frame.getContentPane().add(btnRandom);

            /*
             * Create btnMaximum and add an action listener
             * that calls maximumAction().
             */
            JButton btnMaximum = new JButton("Maximum");
            btnMaximum.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    maximumAction();
                }
            });
            btnMaximum.setBounds(6, 59, 117, 29);
            frame.getContentPane().add(btnMaximum);

            /*
             * Create btnMinimum and add an action listener
             * that calls minimumAction().
             */
            JButton btnMinimum = new JButton("Minimum");
            btnMinimum.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    minimumAction();
                }
            });
            btnMinimum.setBounds(6, 100, 117, 29);
            frame.getContentPane().add(btnMinimum);

            /*
             * Create btnRemove and add an action listener
             * that calls removeAction().
             */
            JButton btnRemove = new JButton("Remove");
            btnRemove.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    removeAction();
                }
            });
            btnRemove.setBounds(6, 141, 117, 29);
            frame.getContentPane().add(btnRemove);

            /*
             * Create btnSort and add an action listener
             * that calls sort().
             */
            JButton btnSort = new JButton("Sort");
            btnSort.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    sort();
                }
            });
            btnSort.setBounds(6, 182, 117, 29);
            frame.getContentPane().add(btnSort);

            /*
             * Create the JPanel, set the bounds,
             * and add it to the frame.
             */
            JPanel panel = new JPanel();
            panel.setBounds(135, 0, 465, 378);
            frame.getContentPane().add(panel);

            //Initialize the unsorted collection
            collection = new DataCollection<Item>(COLLECTION_SIZE);

            //Initialize the sorted collection
            sortedCollection = new DataCollection<Item>(COLLECTION_SIZE);

            repaint();
        }


        public void paintComponent(Graphics panel) {

            super.paintComponent(panel);

            panel.drawString("Hello World", 140 , 10);

            /*
             *  Display the Items when instantiated.
             */

            if (collection != null) 
            { 

                Item item;              
                int xCoord = firstItemXCoord;

                /*
                 * Reset the selected item to the start of the collection,
                 * ensuring it always starts at the first node
                 */
                collection.reset();

                        //While there is another node in the collection, loop through.
                while (collection.hasNext()) 
                {
                    /*
                     * Set the item to the selected node. 
                     * Which since reset() was called on the 
                     * collection, it should be the first node 
                     * in the collection. Then set the next node in the
                     * collection a the selected one.
                     */
                    item = collection.next(); 

                    /*
                     * Call the paint method in the item class
                     */
                    item.paint(panel, xCoord, firstItemXCoord);
                    xCoord += Item.OVERALL_WIDTH;
                }

            }

            /*
             *  Display the Items when instantiated.
             */

            if (sortedCollection != null) 
            { 
                Item item; 
                int xCoord = firstItemXCoord + 200;

                /*
                 * Reset the selected item to the start of the collection,
                 * ensuring it always starts at the first node
                 */
                sortedCollection.reset();

                        //While there is another node in the collection, loop through.
                while (sortedCollection.hasNext()) 
                {
                    /*
                     * Set the item to the selected node. 
                     * Which since reset() was called on the 
                     * sortedCollection, it should be the first node 
                     * in the collection. Then set the next node in the
                     * collection a the selected one.
                     */
                    item = sortedCollection.next(); 

                    /*
                     * Call the paint method in the item class
                     */
                    item.paint(panel, xCoord, firstItemXCoord);
                    xCoord += Item.OVERALL_WIDTH;
                }

            }
        }

        //
        // Random
        //
        public void randomAction() 
        {
            collection.clear(); // We restart with nothing,
            // then we add random items,
            for (int i = 1; i <= COLLECTION_SIZE; i++) 
            {
                collection.add(new Item((int) (1 + MAXIMUM_ITEM_VALUE
                        * Math.random()), DEFAULT_COLOR));
            }
            selected = null; // We make sure nothing is selected
        }

【问题讨论】:

  • 您是否检查过您的面板的尺寸是否足够大,可以看到上面的任何东西?您按照您应该做的那样覆盖paintComponent,它确实需要一个Graphics 对象,除此之外,只要您确定paintComponent 中的所有代码都按照您认为应该执行的方式执行,一切都会检查出来.
  • 我相信面板的大小是正确的。如果我正确读取 API,panel.setBounds(135, 0, 465, 378); 应将左上角设置为 (135,0) 并将尺寸设置为 465 x 378。除非我应该使用setSize(int width, int height)
  • 实际上应用于 Panel 父级的布局管理器决定了绘制大小和位置。
  • @user2220927,不要使用 setBounds() 来调整面板上组件的大小和位置。使用布局管理器。

标签: java swing jpanel


【解决方案1】:

查看Custom Painting Approaches 了解自定义绘画的几种方法。

程序应该在按下“随机”按钮时绘制条形图,但目前不绘制任何内容

您可能希望使用将对象添加到 ArrayList 的第一种方法,以便拥有要绘制的对象列表。所以按钮会添加要绘制的对象,然后调用面板上的 repaint() 方法。

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 2012-07-23
    • 2014-04-19
    • 2016-03-01
    相关资源
    最近更新 更多