Specifying the location of Canvas in Swing

后端 未结 2 2113
南旧
南旧 2020-12-11 20:11

I\'m learning Swing GUI design. One thing I haven\'t quite sorted out is how to add an add a Canvas to a specific location in a container.

More specifi

相关标签:
2条回答
  • 2020-12-11 20:31

    "Swing programs should override paintComponent() instead of overriding paint()."—Painting in AWT and Swing: The Paint Methods. JPanel or JComponent are common choices, as suggested here. You can control placement using a suitable layout.

    Addendum: How does this relate to Canvas?

    The class java.awt.Canvas is an AWT component; instead use the Swing component javax.swing.JPanel. Here's a variation of your program that merely selects a random color, but it might give you an idea how to address your other properties. There's a related example here.

    image

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Random;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    
    public class MainCode {
    
        public static void main(String args[]) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    MainView fc = new MainView();
                }
            });
        }
    
        private static class MainView implements ActionListener {
    
            private JFrame f = new JFrame();
            private JButton colorButton = new JButton("Color");
            private JButton quitButton = new JButton("Quit");
            private JButton infoButton = new JButton("Info");
            private JLabel x_loc = new JLabel("X:");
            private JLabel y_loc = new JLabel("Y:");
            private JLabel w_label = new JLabel("Width:");
            private JLabel h_label = new JLabel("Height:");
            private JTextField x_loc_box = new JTextField("0");
            private JTextField y_loc_box = new JTextField("0");
            private JTextField w_loc_box = new JTextField("100");
            private JTextField h_loc_box = new JTextField("100");
            private JOptionPane info1 = new JOptionPane();
            private JPanel panel1 = new JPanel();
            private JPanel panel2 = new JPanel();
            private GraphicsClass graphicsClass = new GraphicsClass();
    
            public MainView() {
                panel1.add(x_loc);
                panel1.add(x_loc_box);
                panel1.add(y_loc);
                panel1.add(y_loc_box);
                panel1.add(w_label);
                panel1.add(w_loc_box);
                panel1.add(h_label);
                panel1.add(h_loc_box);
                colorButton.addActionListener(this);
                quitButton.addActionListener(this);
                infoButton.addActionListener(this);
                panel2.add(colorButton);
                panel2.add(quitButton);
                panel2.add(infoButton);
                f.add(panel1, BorderLayout.NORTH);
                f.add(graphicsClass, BorderLayout.CENTER);
                f.add(panel2, BorderLayout.SOUTH);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setTitle("Graphics Toolbox v2");
                f.pack();
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                if (e.getSource() == infoButton) {
                    JOptionPane.showMessageDialog(f, "hahahahahaha");
                } else if (e.getSource() == quitButton) {
                    System.exit(0);
                } else if (e.getSource() == colorButton) {
                    graphicsClass.randomColor();
                    graphicsClass.repaint();
                }
            }
        }
    
        private static class GraphicsClass extends JPanel {
    
            private static final int SIZE = 128;
            private static final Random r = new Random();
            private Color color = Color.green;
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(SIZE, SIZE);
            }
    
            public void randomColor() {
                this.color = new Color(r.nextInt());
            }
    
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(color);
                int w = getWidth();
                int h = getHeight();
                g.fillArc(0, h / 4, w, h, 45, 90);
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-11 20:48

    Appends the canvas to the end of this panel. A component has been added to a container that has been displayed, validate must be called on that container to display the new component.

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