2017-04-09 3 views
-1

JButton (스크린 샷의 오른쪽 상자)이있는 JDialog가 있습니다. JButton을 클릭하면 다른 JFrame에서 JPanel의 크기를 변경하고 싶습니다 (스크린 샷의 왼쪽 상자).JButton을 통해 JPanel 크기를 변경하십시오.

내 문제는 현재 내 응용 프로그램이 JPanel의 크기를 새 크기 (20, 20)로 변경하지 않는다는 것입니다.이 때 "click me"버튼을 클릭하면됩니다. 버튼을 클릭하면 내 testtext "Hello world"가 콘솔에 표시됩니다.

예 스크린 샷 : 스크린 샷이 표시되지 않는 경우

대체 링크 :

Dialog.java (JDialog의)

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class Dialog extends JDialog implements ActionListener{ 

    public Dialog(){ 
     JDialog d = new JDialog(); 

     d.setSize(300, 300); 

     JButton b = new JButton("click me"); 
     b.addActionListener(new Generator()); 
     d.add(b); 


     d.setVisible(true); 


    } 

} 
: 여기

http://www.dachaufsetzer.net/files/images/other/java-question-1.jpg 내 코드입니다

Gener (Generator.java를 사용 JFrame의) ator.java (Frame.java에서 사용되는 인 JPanel)

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Generator extends JPanel implements ActionListener{ 

    int width; 
    int height; 

    public Generator(){ 

    } 

    public Generator(int w, int h){ 

     this.width = w; 
     this.height = h; 

     super.setBackground(Color.red); 
     super.setPreferredSize(new Dimension(this.width, this.height)); 

    } 

    @Override 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(Color.BLUE); 
     g.fillOval(0, 0, 50, 50); 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     super.setPreferredSize(new Dimension(20, 20)); 
     System.out.println("Hello world"); 
    } 
} 

Frame.java

import java.awt.*; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 

public class Frame extends JFrame { 

    public Frame(){ 

     JFrame f = new JFrame(); 
     f.setSize(400, 400); 

     Generator g = new Generator(2000, 2000); 

     JScrollPane scrollPane = new JScrollPane(g); 
     scrollPane.setPreferredSize(new Dimension(300,300)); 

     f.add(scrollPane); 

     f.setVisible(true); 
    } 

}

메인 .java (메인 클래스)

public class Main { 

    public static void main(String[] args) { 

     Frame window = new Frame(); 
     Dialog d = new Dialog(); 

    }  
} 

지원해 주셔서 감사합니다.

답변

0

당신은 감각이없는 일을하고 있습니다. 당신의 Frame 클래스에서

당신이 Frame 클래스는 쓸모가 만드는 생성자에서 다른 JFrame의 객체를 생성하는 다음 Frame 클래스에 대한

. Dialog에서 크기를 변경하려면 Frame ScrollPane에 추가 한 Generator 패널의 참조를 저장해야합니다. Dialog 클래스에 대한

import java.awt.*; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 

public class Frame extends JFrame { 
    public Generator g; 

    public Frame(){ 
     setSize(400, 400); 
     g = new Generator(2000, 2000); 
     JScrollPane scrollPane = new JScrollPane(g); 
     scrollPane.setPreferredSize(new Dimension(300,300)); 
     add(scrollPane); 
     setVisible(true); 
    } 
} 

:

당신은 같은 실수를했을 이것은 변경 사항으로 Frame 클래스입니다. Dialog 클래스 생성자에 다른 JDialog 개체를 생성 중입니다.또 다른 큰 실수는 버튼에 조치 수신기로 new Generator()을 추가한다는 것입니다. Frame에 추가하는 Generator 패널의 크기를 변경하려면 해당 패널의 참조를 가져 와서 ActionListener로 추가해야합니다. 매개 변수로

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class Dialog extends JDialog implements ActionListener{ 

    public Dialog(Generator g){ 
     setSize(300, 300); 
     JButton b = new JButton("click me"); 
     b.addActionListener(g); 
     add(b); 
     setVisible(true); 
    } 
} 

당신이 볼 수 있듯이, 이제 Dialog 생성자가 Generator :이 변경 사항으로 Dialog 클래스입니다. 이 매개 변수는 변경할 패널입니다. 자신의 메인 클래스의 다음

:

public class Main { 
    public static void main(String[] args) { 
     Frame window = new Frame(); 
     //Here you send to Dialog constructor the panel you add to the Frame 
     Dialog d = new Dialog(window.g); 
    }  
} 

new을 사용하여 클래스의 인스턴스를 만들 때이 인스턴스가 동일한 유형의 다른 인스턴스는 다른 속성을 가지고있다. 귀하의 코드에서 동일한 유형의 인스턴스를 두 개 이상 만들고, 그 중 하나를 변경하면 다른 인스턴스가 변경 될 것이라고 생각합니다 (실제로는 두 개의 분리 된 것으로 이해하지 못한다고 생각합니다).

+0

큰 도움을 주신 Flood2d에게 감사드립니다. 이제는 분명합니다! – spiceflo

1

ActionListener 코드에서 기본 크기를 재설정 한 후에 revalidate()을 호출해야합니다. 그러면 레이아웃 관리자가 호출됩니다.

revalidate() 뒤에 repaint()을 호출해야 할 수도 있습니다.

물론 이것은 패널 크기 만 변경합니다. 대화 상자의 크기는 그대로 유지됩니다. 크기를 조정하려면 대화 상자에서 pack()을 호출해야 할 수도 있습니다. ActionListener에 SwingUtilities.windowForComponent(...)을 사용하여 대화 상자에 대한 참조를 가져올 수 있습니다.

+0

Flood2d와의 의견을 보내 주셔서 감사합니다. – spiceflo

관련 문제