2017-11-22 15 views
1

GUIスライダで長方形の色を変えようとしています。私はこれがバックグラウンドを変更することによって行うことができますが、私は再描画を使用しようとしていることを知っています。Repaint何もしていない

私は、再ペイントが要求を保持し、ほとんど実行することを知っています。私は立ち往生しているので、回避策を見つけようとしています。

私はrepaint()を読んでいます。 repaintManagerと私のコードを操作しようとしたが、私はまだ私の希望の出力を得ることができません。

ご協力いただければ幸いです。

import java.awt.BorderLayout; 
import javax.swing.*; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import javax.swing.SwingConstants; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

/** 
* 
* 
*/ 
public class MyColorChooser2 extends JPanel { 

    private JFrame frame; 
    private JLabel redLabel, greenLabel, blueLabel; 
    private JSlider redSlider, greenSlider, blueSlider; 
    private JTextField redTextField, greenTextField, blueTextField; 

    private JPanel redPanel, greenPanel, bluePanel, colorPanel, paintPanel; 

    private int holdNbr1, holdNbr2, holdNbr3; 
    DrawPanel rect = new DrawPanel(); 

    public MyColorChooser2() { 
     JFrame frame = new JFrame(); 

     frame.setTitle("Color Chooser"); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // set up labels 
     redLabel = new JLabel("Red:"); 
     greenLabel = new JLabel("Green:"); 
     blueLabel = new JLabel("Blue:"); 

     // set up sliders and register their event handler: 
     redSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 255, 50); 
     redSlider.setMajorTickSpacing(10); // create tick every 10 
     redSlider.setPaintTicks(true); // paint ticks on slider 

     greenSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 255, 100); 
     greenSlider.setMajorTickSpacing(10); // create tick every 10 
     greenSlider.setPaintTicks(true); // paint ticks on slider 

     blueSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 255, 200); 
     blueSlider.setMajorTickSpacing(10); // create tick every 10 
     blueSlider.setPaintTicks(true); // paint ticks on slider 

     //slider event handling: 
     SliderHandler sliderHandler = new SliderHandler(); 
     redSlider.addChangeListener(sliderHandler); 
     greenSlider.addChangeListener(sliderHandler); 
     blueSlider.addChangeListener(sliderHandler); 

     //set up textFields and register their event handler: 
     redTextField = new JTextField(3); 
     redTextField.setText("50"); //initialize 
     redTextField.setEditable(false); 
     redTextField.setText("" + redSlider.getValue()); 

     greenTextField = new JTextField(3); 
     greenTextField.setText("100"); //initialize 
     greenTextField.setEditable(false); 
     greenTextField.setText("" + greenSlider.getValue()); 

     blueTextField = new JTextField(3); 
     blueTextField.setText("200"); //initialize 
     blueTextField.setEditable(false); 
     blueTextField.setText("" + blueSlider.getValue()); 


     // build colorPanel: 
     // build redPanel:  
     redPanel = new JPanel(); 
     redPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); 
     redPanel.add(redLabel); 
     redPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); 
     redPanel.add(redSlider); 
     redPanel.add(redTextField); 
     // build greenPanel: 
     greenPanel = new JPanel(); 
     greenPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); 
     greenPanel.add(greenLabel); 
     greenPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); 
     greenPanel.add(greenSlider); 
     greenPanel.add(greenTextField); 
     // build bluePanel: 
     bluePanel = new JPanel(); 
     bluePanel.setLayout(new FlowLayout(FlowLayout.LEFT)); 
     bluePanel.add(blueLabel); 
     bluePanel.setLayout(new FlowLayout(FlowLayout.CENTER)); 
     bluePanel.add(blueSlider); 
     bluePanel.add(blueTextField); 

     colorPanel = new JPanel(); 
     colorPanel.add(redPanel); 
     colorPanel.add(greenPanel); 
     colorPanel.add(bluePanel); 

     frame.setLayout(new BorderLayout()); 
     frame.add(rect, BorderLayout.CENTER); 
     frame.add(colorPanel, BorderLayout.SOUTH); 

     frame.setPreferredSize(new Dimension(900, 300)); 
     frame.setVisible(true); 
     frame.pack(); 

    } 

    public class DrawPanel extends JPanel { 

     private Color color; 
     private int red = 50, blue = 100, green = 200; 
     private Graphics g; 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      changeColor(); 
      g.setColor(color); 

      g.fillRect(10, 10, 880, 200); 
      g.dispose(); 

     } 

     public void DrawPanel(Color c) { 

      color = c; 

      red = color.getRed(); 
      green = color.getGreen(); 
      blue = color.getBlue(); 

     } 

     void changeColor() { 

      color = new Color(red, green, blue); 
      this.color = color; 

     } 

     public void setRed(int r) { 
      red = r; 
      changeColor(); 

     } 

     public void setBlue(int b) { 
      blue = b; 
      changeColor(); 

     } 

     public void setGreen(int g) { 
      green = g; 
      changeColor(); 

     } 
    } 

    private class SliderHandler implements ChangeListener { 

     @Override 
     public void stateChanged(ChangeEvent e) { 
      JSlider change = (JSlider) e.getSource(); 
      DrawPanel draw = new DrawPanel(); 
      int value; 

      if (change == redSlider) { 
       value = change.getValue(); 
       redTextField.setText(String.valueOf(value)); 
       draw.setRed(value); 
      } else if (change == greenSlider) { 
       value = change.getValue(); 
       greenTextField.setText(String.valueOf(value)); 
       draw.setGreen(value); 
      } else if (change == blueSlider) { 
       value = change.getValue(); 
       blueTextField.setText(String.valueOf(value)); 
       draw.setBlue(value); 
      } 

      draw.changeColor(); 
      draw.repaint(); 
     } 

    } 

    public static void main(String args[]) { 
     MyColorChooser2 color = new MyColorChooser2(); 
    } 
} 
+0

あなたはこのコードをしようと気にしませんか?確かにあなたがそれを行う時までにまだそれで済んでいない! –

+0

私は私の最終目標に到達しようとした多くのものの一つでした。私は元のものを処分すれば、長い時間をかけずに新しい図形を描き直すことができると考えました。必要に応じて実行されません。 –

答えて

1

何もしていないわけではありません。問題はあなたが立ち往生していることです。なぜなら、変更するたびに別のコンポーネントを更新しようとしているからです。あなたはあなたの状態の複数のパネルを作り直しています。

正しく動作させるために行った変更についてのコメントを追加しました。もっと助けが必要な場合は、尋ねてください。乾杯!なぜあなたは ``そこにあなたのGraphics`コンテキストをdispose`ingている

public class MyColorChooser2 extends JPanel { 

    private JFrame frame; 
    private DrawPanel drawPanel; 

    private JLabel redLabel, greenLabel, blueLabel; 
    private JSlider redSlider, greenSlider, blueSlider; 
    private JTextField redTextField, greenTextField, blueTextField; 

    private JPanel redPanel, greenPanel, bluePanel, colorPanel, paintPanel; 

    private int holdNbr1, holdNbr2, holdNbr3; 
    private Color initialColor = Color.RED; 

    public MyColorChooser2() { 
     JFrame frame = new JFrame(); 
     frame.setTitle("Color Chooser"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Let DrawPanel choose the initial color. I don't care. 
     drawPanel = new DrawPanel(); 
     // This way I control what is the initial color 
     //drawPanel = new DrawPanel(initialColor); 

     // set up labels 
     redLabel = new JLabel("Red:"); 
     greenLabel = new JLabel("Green:"); 
     blueLabel = new JLabel("Blue:"); 

     // set up sliders and register their event handler: 
     redSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 255, initialColor.getRed()); 
     redSlider.setMajorTickSpacing(10); // create tick every 10 
     redSlider.setPaintTicks(true); // paint ticks on slider 

     greenSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 255, initialColor.getGreen()); 
     greenSlider.setMajorTickSpacing(10); // create tick every 10 
     greenSlider.setPaintTicks(true); // paint ticks on slider 

     blueSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 255, initialColor.getBlue()); 
     blueSlider.setMajorTickSpacing(10); // create tick every 10 
     blueSlider.setPaintTicks(true); // paint ticks on slider 

     // slider event handling: 
     SliderHandler sliderHandler = new SliderHandler(); 
     redSlider.addChangeListener(sliderHandler); 
     greenSlider.addChangeListener(sliderHandler); 
     blueSlider.addChangeListener(sliderHandler); 

     // set up textFields and register their event handler: 
     redTextField = new JTextField(3); 
     redTextField.setText("50"); // initialize 
     redTextField.setEditable(false); 
     redTextField.setText("" + redSlider.getValue()); 

     greenTextField = new JTextField(3); 
     greenTextField.setText("100"); // initialize 
     greenTextField.setEditable(false); 
     greenTextField.setText("" + greenSlider.getValue()); 

     blueTextField = new JTextField(3); 
     blueTextField.setText("200"); // initialize 
     blueTextField.setEditable(false); 
     blueTextField.setText("" + blueSlider.getValue()); 

     // build colorPanel: 
     // build redPanel: 
     redPanel = new JPanel(); 
     redPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); 
     redPanel.add(redLabel); 
     redPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); 
     redPanel.add(redSlider); 
     redPanel.add(redTextField); 
     // build greenPanel: 
     greenPanel = new JPanel(); 
     greenPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); 
     greenPanel.add(greenLabel); 
     greenPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); 
     greenPanel.add(greenSlider); 
     greenPanel.add(greenTextField); 
     // build bluePanel: 
     bluePanel = new JPanel(); 
     bluePanel.setLayout(new FlowLayout(FlowLayout.LEFT)); 
     bluePanel.add(blueLabel); 
     bluePanel.setLayout(new FlowLayout(FlowLayout.CENTER)); 
     bluePanel.add(blueSlider); 
     bluePanel.add(blueTextField); 

     colorPanel = new JPanel(); 
     colorPanel.add(redPanel); 
     colorPanel.add(greenPanel); 
     colorPanel.add(bluePanel); 

     frame.setLayout(new BorderLayout()); 
     frame.add(drawPanel, BorderLayout.CENTER); 
     frame.add(colorPanel, BorderLayout.SOUTH); 

     frame.setPreferredSize(new Dimension(900, 300)); 
     frame.setVisible(true); 
     frame.pack(); 

    } 

    private class DrawPanel extends JPanel { 

     private Color color; 
     private int red = 255, blue = 0, green = 0; 

     @Override 
     protected void paintComponent(Graphics g) { 
      // I've removed the call to changeColor because it was creating 
      // an infinite loop of revalidates and repaints. 
      // Now, the paintComponent just finishes the job it was required to. 
      super.paintComponent(g); 
      g.setColor(color); 
      g.fillRect(10, 10, 880, 200); 
     } 

     public DrawPanel() { 
      this(Color.BLUE); 
     } 

     public DrawPanel(Color c) { 
      color = c; 
      red = color.getRed(); 
      green = color.getGreen(); 
      blue = color.getBlue(); 

      // I'm calling this first repaint here just to make 
      // sure the panel is initiated the way we want with 
      // the given Color 
      repaint(); 
     } 

     void changeColor() { 
      color = new Color(red, green, blue); 
      // We just need to change the color and call this repaint here 
      // so that the paintComponent can do its job 
      repaint(); 
     } 

     public void setRed(int r) { 
      red = r; 
      changeColor(); 
     } 

     public void setBlue(int b) { 
      blue = b; 
      changeColor(); 
     } 

     public void setGreen(int g) { 
      green = g; 
      changeColor(); 
     } 
    } 

    private class SliderHandler implements ChangeListener { 

     @Override 
     public void stateChanged(ChangeEvent e) { 
      JSlider change = (JSlider) e.getSource(); 
      int value; 

      // I've removed this line of code because you were 
      // recreating the drawingPanel. That's not what you want. 
      // You want to reuse the same panel. 
      // DrawPanel draw = new DrawPanel(); 

      if (change == redSlider) { 
       value = change.getValue(); 
       redTextField.setText(String.valueOf(value)); 
       drawPanel.setRed(value); 
      } else if (change == greenSlider) { 
       value = change.getValue(); 
       greenTextField.setText(String.valueOf(value)); 
       drawPanel.setGreen(value); 
      } else if (change == blueSlider) { 
       value = change.getValue(); 
       blueTextField.setText(String.valueOf(value)); 
       drawPanel.setBlue(value); 
      } 

      // You don't need to call those methods, because the 
      // changeColor will be called by the settings 
      // of Red, Green   and Blue 
      //  draw.changeColor(); 
      //  draw.repaint(); 

     } 

    } 

    public static void main(String args[]) { 
     MyColorChooser2 color = new MyColorChooser2(); 
    } 
} 
+0

ありがとうございました! 1つの疑問は、プライベートカラーinitialColor = Color.REDの目的は何ですか。 initialColorで描画パネルを呼び出します。 DrawPanelクラスにはデフォルトのメソッドがないので、これにはいくつかの意味がありますか? –

+0

私はそれを探してクラスを検索することなく、フィールドの値を変更してinitialColorを選択できるようにしました。 DrawPanelは赤、緑、青のスライダを開始できるように初期カラーを受け入れます。しかし、DrawPanelコンストラクタから色を削除し、DrawPanelクラスの中でスライダのデフォルト値を設定することで、違ったやり方をすることができました。両方のアプローチを、特定の色を使用するデフォルトのコンストラクタと組み合わせることができます。私は答えを編集してチェックアウトします。 – wleao

+0

これで設計に問題が発生しました。デフォルトの色でdrawPanelを開始しますが、スライダは別のものでインスタンス化されます。あなたはそれを見ましたか?最初の色を選択し、drawPanelに初期色を選択させることで、コードを適切に再現するようにコードを再設計してください。 – wleao

関連する問題