按下按钮时画线摆动

时间:2019-01-23 20:38:57

标签: java swing graphics jbutton

我在通过FrameJButton上画一条简单的线时遇到了一些问题。 仅当我使用JButton执行此操作时,才会出现问题。 如果我直接在JPanel中使用Frame,一切正常。

JFrame

import javax.swing.*;
import java.awt.*;

public class Fenetre extends JFrame {

    public Fenetre(){
        super("Test");
        init();
        pack();
        setSize(200,200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    private void init() {
        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());

        JButton button = new JButton("Draw line");

        button.addActionListener((e)->{
            Pane s = new Pane();
            panel.add(s);
            s.repaint();
        });

        panel.setBackground(new Color(149,222,205));

        add(button,BorderLayout.SOUTH);
        add(panel,BorderLayout.CENTER);
    }

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

}

还有JPanelpaintComponents()

import javax.swing.*;
import java.awt.*;

public class Pane extends JPanel {

    public void paintComponents(Graphics g){
        super.paintComponents(g);
        g.drawLine(0,20,100,20);
    }
}

1 个答案:

答案 0 :(得分:1)

许多问题立即引起我的注意:

  1. 您应该使用paintComponent,而不是paintComponents(请注意结尾处的s),因为您在绘画链中的位置太高了。也不需要将任何一个方法设为public,类之外的任何人都不应调用它。
  2. Pane没有提供大小提示,因此其“默认”大小为0x0

相反,它看起来应该更像...

public class Pane extends JPanel {

    public Dimension getPreferredSize() {
        return new Dimension(100, 40);
    }

    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawLine(0,20,100,20);
    }
}

添加组件时,Swing是惰性的。除非必须或您要求,否则它不会运行布局/绘画过程。这是一种优化,因为您可能需要执行布局传递之前添加许多组件。

要请求通过布局,请在您已更新的顶级容器上调用revalidate。根据一般经验,如果您致电revalidate,也应该致电repaint来申请新的绘画通行证。

public class Fenetre extends JFrame {

    public Fenetre(){
        super("Test");
        init();
        //pack();
        setSize(200,200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    private void init() {
        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());

        JButton button = new JButton("Draw line");

        button.addActionListener((e)->{
            Pane s = new Pane();
            panel.add(s);
            panel.revalidate();
            panel.repaint();
            //s.repaint();
        });

        panel.setBackground(new Color(149,222,205));

        add(button,BorderLayout.SOUTH);
        add(panel,BorderLayout.CENTER);
    }

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

}

至少应该让您的panel现在出现