如何让我的动作监听器从当前的JPanel中删除内容?

时间:2017-01-26 22:13:27

标签: java swing button actionlistener

我正在尝试添加一个按钮,按下该按钮,清除JPanel上的内容并将面板返回其原始设置。我该怎么做呢?我试图重新验证,删除所有等,但到目前为止没有一个对我有用。关于我如何做到这一点的任何建议?我将附上以下代码,非常感谢帮助。

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

public class WindowBlind extends JFrame
                         implements ChangeListener, ActionListener {

    private JSlider slider;           
    private int sliderValue = 0;  
    private JPanel panel;             
    private JButton open;
    private JButton close;
    private JButton exit;
    private boolean clear;

    public static void main(String[] args) {

        WindowBlind applic = new WindowBlind();
        applic.setLocation(100,100);
        applic.setVisible(true);

    } // main

    public WindowBlind() {

        setDefaultCloseOperation(EXIT_ON_CLOSE);

        setTitle("WindowBlind");
        setSize(300,300);

        Container window = getContentPane();
        window.setLayout(new FlowLayout()); 

        panel = new JPanel() {

                    public void paintComponent(Graphics g) {
                        super.paintComponent(g); 
                        paintScreen(g);         

                    } // paintComponent
                };
        panel.setPreferredSize(new Dimension(200, 200));
        panel.setBackground(Color.white);
        window.add(panel);

        slider = new JSlider(JSlider.VERTICAL,0,100,0);
        slider.setInverted(true);               // 0 will be at top, not bottom, of vertical slider
        window.add(slider);
        slider.addChangeListener(this);         // Register for slider events

        JButton open = new JButton("Open Slider");
        window.add(open);
        open.addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent e) {

              }
            });

        JButton close = new JButton("Close Slider");
        window.add(close);
        close.addActionListener(this);


        JButton exit = new JButton("Exit Slider");
        window.add(exit);
        exit.addActionListener(this);


    } // WindowBlind constructor

    public void paintScreen(Graphics g) {

        g.setColor(Color.cyan);
        g.fillRect(70, 40, 60, 100);         // The blue sky
        g.setColor(Color.lightGray);
        g.fillRect(70, 40, 60, sliderValue); // The blind, partially closed
        g.setColor(Color.black);
        g.drawRect(70, 40, 60, 100);         // The window frame

    } // paintScreen

    // When the slider is adjusted, this method is called automatically
    public void stateChanged(ChangeEvent e) {

          sliderValue = slider.getValue();  // Fetch the slider's current setting
          repaint();                        // Force a screen refresh (paintComponent is called indirectly)

    } // stateChanged

    @Override
    public void actionPerformed(ActionEvent e) {



    }


} 

2 个答案:

答案 0 :(得分:2)

我正在进行一次巨大的猜测,并假设你想要将滑块重置为它的默认值"状态,这表示您需要更改close.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { sliderValue = 0; slider.repaint(); } }); ,类似于......

public class SliderPane extends JPanel {

    private double sliderValue;

    public double getSliderValue() {
        return sliderValue;
    }

    public void setSliderValue(double sliderValue) {
        this.sliderValue = Math.max(Math.min(1.0, sliderValue), 0);
        repaint();
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(100, 200);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); 
        int width = getWidth();
        int height = getHeight();
        g.setColor(Color.cyan);          
        g.fillRect(0, 0, width, height);         // The blue sky
        g.setColor(Color.lightGray);
        g.fillRect(0, 0, width, (int)(sliderValue * height)); // The blind, partially closed
        g.setColor(Color.black);
        g.drawRect(0, 0, width, height);         // The window frame
    }

}

更好的解决方案是生成一个自包含的类,它封装了所有这些功能,例如......

setSliderValue

然后您可以通过x <- 1:10 方法控制滑块值。

这也允许您将滑块值指定为百分比,这意味着组件的大小并不重要,因为填充的区域是高度的百分比

答案 1 :(得分:0)

这是因为您总是从面板的paintScreen方法中调用paintComponent。我建议这种中和:

panel = new JPanel() {
                boolean drawMe = true;

                public void paintComponent(Graphics g) {
                    super.paintComponent(g); 
                    if(drawMe)
                          paintScreen(g);         

                } // paintComponent
            };

每当您想要清除面板时,请执行以下操作:

panel.drawMe=false;
panel.invalidate();