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

どのように取得するのかはわかりJFrameませんが、paintComponentメソッドがないため、呼び出されることはありません。

代わりに、私がすることは

  • できるだけ早くソース画像を読み込み、変数に保存します(masterImageたとえば)
  • a を使用しJLabelて画像を表示する
  • javax.swing.Timer短い遅延 (125 ミリ秒) を設定して使用し、繰り返さないようにします。JSliderstateChangedイベントが発生するたびに、restartこのタイマーを使用します。

タイマーが最終的にトリガーされると、「マスター」画像の明るさを更新し、その結果をJLabelアイコンとして「画像」に適用します。

タイマーの理由は、明るさを適用する操作に時間がかかるだけでなく、アプリケーションが消費するメモリの量が増える可能性があるためです。可能であれば、これを最小限に抑えたいと思うでしょう。

于 2013-08-13T09:43:14.513 に答える