代码之家  ›  专栏  ›  技术社区  ›  parrot15

如何在点击按钮时重新绘制JPanel?

  •  2
  • parrot15  · 技术社区  · 8 年前

    我是swing新手,目前正在尝试制作一个绘图程序。这就是我目前所拥有的。

    import java.util.*;
    import static java.lang.System.*;
    import java.awt.*;
    import javax.swing.*;
    public class DrawingBoard {
        static JPanel buttonPanel;
        static JPanel drawingPanel;
        public static void main(String[] args) {
            JFrame window = new JFrame();
            window.setSize(500, 500);
            window.setTitle("Drawing Board");
            window.getContentPane().setBackground(Color.black);
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            window.setLayout(new FlowLayout());
    
            buttonPanel = new JPanel();
            buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
            buttonPanel.setPreferredSize(new Dimension(80, 500));
            buttonPanel.setBackground(Color.lightGray);
            DrawingComponent drawingComp = new DrawingComponent();
            drawingComp.setButtonPanel();
            window.getContentPane().add(buttonPanel);
    
            drawingPanel = new JPanel();
            drawingPanel.setPreferredSize(new Dimension(420, 500));
            drawingPanel.setBackground(Color.white);
            drawingPanel.add(drawingComp);
            window.getContentPane().add(drawingPanel);
    
            window.pack();
            window.setVisible(true);
        }
    }
    

    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    import static java.lang.System.*;
    public class DrawingComponent extends JComponent implements ActionListener {
        private static final long serialVersionUID = 1L;
        public void paint(Graphics g) {
            super.paintComponents(g);
            g.setColor(Color.red);
            g.fillRect(50, 50, 150, 150);
        }
        public  void setButtonPanel() {
            JLabel colors = new JLabel("Colors", SwingConstants.CENTER);
            DrawingBoard.buttonPanel.add(colors);
    
            JButton red = new JButton("Red");
            DrawingBoard.buttonPanel.add(red);
            red.addActionListener(this);
    
            JButton blue = new JButton("Blue");
            DrawingBoard.buttonPanel.add(blue);
            blue.addActionListener(this);
    
            JButton green = new JButton("Green");
            DrawingBoard.buttonPanel.add(green);
            green.addActionListener(this);
    
            JButton yellow = new JButton("Yellow");
            DrawingBoard.buttonPanel.add(yellow);
            yellow.addActionListener(this);
    
            JButton orange = new JButton("Orange");
            DrawingBoard.buttonPanel.add(orange);
            orange.addActionListener(this);
    
            JButton pink = new JButton("Pink");
            DrawingBoard.buttonPanel.add(pink);
            pink.addActionListener(this);
    
            JButton purple = new JButton("Purple");
            DrawingBoard.buttonPanel.add(purple);
            purple.addActionListener(this);
    
            JButton black = new JButton("Black");
            DrawingBoard.buttonPanel.add(black);
            black.addActionListener(this);
    
            JLabel tools = new JLabel("Tools", SwingConstants.CENTER);
            DrawingBoard.buttonPanel.add(tools);
    
            JButton erase = new JButton("Erase");
            DrawingBoard.buttonPanel.add(erase);
            erase.addActionListener(this);
    
            JButton drawLine = new JButton("Lines");
            DrawingBoard.buttonPanel.add(drawLine);
            drawLine.addActionListener(this);
    
            JButton clear = new JButton("Clear");
            DrawingBoard.buttonPanel.add(clear);
            clear.addActionListener(this);
        }
        public void actionPerformed(ActionEvent e) {
            if(e.getActionCommand().equals("Red")) {
                out.println("red");
                repaint();
            }
            else if(e.getActionCommand().equals("Blue")) {
                out.println("blue");
                repaint();
            }
            else if(e.getActionCommand().equals("Green")) {
                out.println("green");
                repaint();
            }
            else if(e.getActionCommand().equals("Yellow")) {
                out.println("yellow");
                repaint();
            }
            else if(e.getActionCommand().equals("Orange")) {
                out.println("orange");
                repaint();
            }
            else if(e.getActionCommand().equals("Pink")) {
                out.println("pink");
                repaint();
            }
            else if(e.getActionCommand().equals("Purple")) {
                out.println("purple");
                repaint();
            }
            else if(e.getActionCommand().equals("Black")) {
                out.println("black");
                repaint();
            }
            else if(e.getActionCommand().equals("Erase")) {
                out.println("erase");
                repaint();
            }
            else if(e.getActionCommand().equals("Lines")) {
                out.println("lines");
                repaint();
            }
            else if(e.getActionCommand().equals("Clear")) {
                out.println("clear");
                repaint();
            }
        }
    }
    

    这是输出的链接图片。 https://i.stack.imgur.com/GEwga.png

    现在,我只希望绘图板在点击按钮时显示某种图形。其他一切都很好,但当我单击任何按钮时,drawingPanel(白色区域)中不会像预期的那样显示任何图形。按钮的println语句仍会执行,但repain()直接无法工作。我该如何使其在单击按钮时调用paintComponent方法,并在drawingPanel(窗口上的白色区域)上显示图形?我已经在这个问题上停留了很长一段时间,因此非常感谢您的帮助。

    1 回复  |  直到 8 年前
        1
  •  1
  •   MadProgrammer    8 年前

    改变 drawingPanel = new JPanel();

    DrawingComponent 默认首选大小为 0x0 ,因此当您将其添加到 JPanel (正在使用 FlowLayout 默认情况下),它的大小为 0x0

    然后更改。。。

    public void paint(Graphics g) {
        super.paintComponents(g);
        g.setColor(Color.red);
        g.fillRect(50, 50, 150, 150);
    }
    

    @Override
    protected void paintComponent(Graphics g) {
        System.out.println("Hello");
        super.paintComponent(g); 
        g.setColor(Color.red);
        g.fillRect(10, 10, 150, 150);
    }
    

    关于你的代码还有很多其他的东西让我害怕,但我没有时间全部解决