0

我正在开发一个应用程序,其中图像的亮度根据用户更改 JSlider 的值。Jslider 显示在窗口上,但未加载图像,我也不知道如何将 JSlider 的值传递给 paintComponent() 方法。

我的代码:

public class Neo_2010_Slider1 extends JFrame
{
    private static final long serialVersionUID = 1L;

    private Container container ;
    private JSlider slider1 ;

    private JLabel lbl1 ;

    private JPanel panel1 ;

    private JTextField txt1 ;
    public Neo_2010_Slider1() {
        super("Slider");
        setAlwaysOnTop(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBackground(new Color(14555));
        setSize(new Dimension(400,400));
        setResizable(true);

        container = getContentPane();
        BorderLayout containerLayout = new BorderLayout();
        container.setLayout(containerLayout);

        lbl1 = new JLabel("Slider 1");


        /****************** TextField Properties ********************************/
        txt1 = new JTextField(4);



        slider1 = new JSlider(JSlider.HORIZONTAL,0,1000,0);//direction , min , max , current
        slider1.setFont(new Font("Tahoma",Font.BOLD,12));
        slider1.setMajorTickSpacing(100);
        slider1.setMinorTickSpacing(25);
        slider1.setPaintLabels(true);
        slider1.setPaintTicks(true);
        slider1.setPaintTrack(true);
        slider1.setAutoscrolls(true);
        slider1.setPreferredSize(new Dimension(500,500));

        slider1.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                txt1.setText(String.valueOf(slider1.getValue()));
                repaint();

            }
        });
        txt1.addActionListener(new ActionListener() {    
            @Override
            public void actionPerformed(ActionEvent e) {
                try
                {
                    slider1.setValue(Integer.parseInt(txt1.getText()));
                }
                catch(Exception ex)
                {
                    txt1.setText("ERROR");
                    txt1.setToolTipText("Set Value in Range between 0 - 1000 ") ;
                }
            }
        });
        this.addFocusListener(new FocusListener() {
            @Override
            public void focusLost(FocusEvent e){
            }

            @Override
            public void focusGained(FocusEvent e) {
                txt1.setText(String.valueOf(slider1.getValue()));                   
            }
        });

        panel1 = new JPanel();
        container.add(panel1, BorderLayout.WEST);
        panel1.add(lbl1);
        panel1.add(txt1);
        panel1.add(slider1);

        setVisible(true);
    }       

    public void paintComponent(Graphics g){
      Graphics2D g2d=(Graphics2D)g;
      try{
          BufferedImage src=ImageIO.read(new File("src.jpg"));

          BufferedImage dest=changeBrightness(src,0.5f);

          g2d.drawImage(dest,0,0,this);

          ImageIO.write(dest,"jpeg",new File("dest.jpg"));
      }catch(Exception e){
            e.printStackTrace();
      }
   } 

   public BufferedImage changeBrightness(BufferedImage src,float val){
       RescaleOp brighterOp = new RescaleOp(val, 0, null);
       return brighterOp.filter(src,null); //filtering
   }

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

我也不知道在哪里通过paintComponent方法..如果有人知道那么请指导我。

4

2 回答 2

1

要获取 JSlider 的值,您应该添加一个 changelistener。

slider.addChangeListener(new ChangeListener(){

    public void stateChanged(ChangeEvent e) {
         // handle change

         JSlider source = (JSlider)e.getSource();
         methodeToHandleChange( (int) source.getValue() );

    }
});

另请参阅如何使用滑块

油漆组件

paintComponent 方法是受保护的方法,因此不能从外部调用。然而,它是绘画机制的一部分,可以通过调用该repaint方法来调用。

slider.repaint();
于 2013-08-13T09:33:28.867 回答
1

我不确定你如何获得什么,但JFrame没有paintComponent方法,所以它永远不会被调用。

我会做的是

  • 尽快加载源图像并将其存储在变量中(masterImage例如)
  • 使用 aJLabel显示图像
  • 使用设置javax.swing.Timer了短延迟(所以 125 毫秒)的 a,这样它就不会重复了。每次引发JSlider'stateChanged事件时,我都会使用restart这个计时器。

当计时器最终触发时,我会更新“主”图像的亮度并将结果应用于“图像”JLabel的图标。

定时器的原因是应用亮度的操作不仅需要时间,而且会增加应用程序消耗的内存量。如果可以,您将希望将其减少到绝对最小值

于 2013-08-13T09:43:14.513 回答