2017-11-22 5 views
1

GUI 슬라이더로 직사각형을 변경하려고합니다. 배경을 변경하여이 작업을 수행 할 수 있음을 알고 있지만 페인트를 다시 사용하려고합니다.Repaint 아무 것도하지 않습니다.

나는 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

정말 고마워요 !! 한 가지 질문은 private color initialColor = Color.RED의 목적이 무엇인가하는 것입니다. 그런 다음 initialColor를 사용하여 그리기 패널을 호출합니다. DrawPanel 클래스의 기본 메서드가 없기 때문에 이것이 중요한 의미가 있습니까? –

+0

그 방법을 통해 클래스의 내부를 조사하지 않고도 필드의 값을 변경하여 initialColor를 선택할 수 있습니다. DrawPanel은 빨강, 녹색 및 파랑 슬라이더를 시작할 수 있도록 초기 색상을 허용합니다. 그러나 DrawPanel 생성자에서 색상을 제거하고 DrawPanel 클래스 안에 슬라이더의 기본값을 설정하여 다르게 할 수 있습니다. 두 가지 방법을 특정 색상을 사용하는 기본 생성자와 결합 할 수 있습니다. 나는 대답을 편집하고 체크 아웃 할 것이다. – wleao

+0

이제 디자인 문제가 있습니다. drawPanel을 기본 색상으로 초기화하지만 슬라이더는 다른 색상으로 인스턴스화됩니다. 당신은 그것을 볼 않았다? 코드를 다시 디자인하여 두 가지 방식으로 올바르게 작동하도록하십시오. 사용자가 초기 색상을 선택하고 drawPanel에서 초기 색상을 선택하게하십시오. – wleao

관련 문제