2013-12-15 3 views
0
private static final long serialVersionUID = 1L; 
String[] options = {"1","2","4","8","16","20","40","100","400"} ; 
int[] optionsNum = {1,2,4,8,16,20,40,100,400}; 
JComboBox<String> box = new JComboBox<>(options); 
JLabel prompt = new JLabel("How complex do you want the circle to be?"); 
ImageIcon image; 

Circle p = new Circle(1); 
int boxindex = 0; 

public CircleDrawer(){ 
    image = new ImageIcon(p.getImage()); 
    box.setSelectedIndex(boxindex); 
    setLayout(new FlowLayout()); 
    add(new JLabel(image)); 
    add(prompt); 
    add(box); 
    pack(); 
    setSize(851, 950); 
    setTitle("Circle Drawer"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    box.addActionListener(this); 

} 

public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == box){ 
     boxindex = box.getSelectedIndex(); 
     p.setComplexity(optionsNum[boxindex]); 
     image = new ImageIcon(p.getImage()); 
     add(new JLabel(image)); 
     validate(); 
    } 
} 

public static void main(String[] args) { 
    CircleDrawer f = new CircleDrawer(); 
    f.setVisible(true); 
} 

기본적으로이 코드가 있습니다. Circle이라는 클래스를 참조합니다.이 클래스는 원의 바깥 쪽 가장자리에있는 일부 점을 계산하고 paintComponent을 사용하여 그립니다. 이 클래스에는 메서드 paintComponent을 가져와 BufferedImage에 넣는 메서드 getImage이 있습니다.이 ActionListener를 JFrame을 완전히 다시 그리는 방법?

public BufferedImage getImage() { 

    BufferedImage hello = new BufferedImage(805, 805, BufferedImage.TYPE_INT_ARGB); 
    Graphics g = hello.getGraphics(); 
    paintComponent(g); 

    return hello; 
} 

이렇게.

내가 겪고있는 문제는 완전히 JFrame을 다시 그릴 수있는 방법을 찾을 수 없다는 것입니다. 나는 removeAll()를 사용하여 actionPerformed 방법 내에서 JFrame을 삭제 시도하고 완전하게 모든 것을 다시 다음 repaint, revalidate, 아니면 그냥 validate 그 (add 구성 요소, pack, setSize, setTitle 등 모든) 프레임을 설정했습니다.

나는 단순히 이미지를 add있는 경우

다음 validate가, 내가 업데이트되는 이미지를 볼 수 있지만 단지 (나는 FlowLayout를 사용하여 그것을 기대하는 것과 같은) JFrame의 말에 압정으로 고정 얻고 있지만, 그건 내가 필요한 행동이 아니야. 단지 일종의 일임을 보여줍니다.

내 질문은 다음과 같습니다. 사용자가 JComboBox 내부의 옵션을 변경하면 JFrame을 다시 그릴 수있게하려면 어떻게해야합니까?

+0

:

add(new JLabel(image)); validate(); 

추가하면 코드의 일반적인 구조는 눈에 보이는 GUI에서 구성 요소를 (제거) /). –

답변

2
Graphics g = hello.getGraphics(); 
paintComponent(g); 

getGraphics()를 사용하지 말고 paintComponent()를 직접 호출하지 마십시오. 스윙은 적절한 페인팅 방법을 필요로합니다. http://sscce.org (빨리,이 [SSCCE] 게시 더 나은 도움이 필요한

add(...); 
revalidate(); // to invoke the layout manager 
repaint(); to repaint the components 
+0

입력 해 주셔서 감사합니다. getGraphics 이외에 무엇을 사용합니까? 구성 요소가있는 변수를'image = new ImageIcon (p.getImage()); '로 변경하기 때문에 구성 요소를 추가/제거하지 않아도됩니다. 그러나 시도 할 때 'revalidate' /'repaint'를 실행하면 아무 일도 일어나지 않습니다. – tssguy123

+0

'getGraphics 이외의 용도는 무엇입니까? '- 구성 요소의 속성을 변경하기 위해 구성 요소에'setter' 메소드가 있습니다. 그런 다음 setter 메서드에서 revalidate() 및 repaint()를 호출합니다. '나는 컴포넌트를 추가/제거 할 필요가 없습니다. '- 전적으로 동의하지만 코드를 게시하면 컴포넌트를 추가한다는 것을 알 수 있으므로 방금이 작업을 수행하는 올바른 방법을 설명했습니다. – camickr

+0

저는'getGraphics'를 사용해야한다고 확신합니다. 'paintComponent'가 레이아웃을 따르게하는 방법이 없다면, 누군가는 'BufferedImage'에 페인팅하는 방법 밖에 없다고 말했고, 어떻게해야 하는지를 검색 할 때'getGraphics'를 사용해야한다고 들었습니다. 나는'actionPerformed' 메쏘드에서 f.repaint()를 호출 할 수없고'repaint()'만 호출 할 수 있습니다. 나는이 시점에서 꽤 혼란 스럽다. 하하. – tssguy123

관련 문제