2017-04-09 9 views
-1

JButton(スクリーンショットの右のボックス)を持つJDialogがあります。 JButtonをクリックすると、別のJFrameのJPanelのサイズを変更したい(スクリーンショットの左のボックス)。JButtonからJPanelのサイズを変更する

私の問題は、現在、私のアプリケーションは、「クリックしてください」というボタンをクリックすると、JPanelのサイズを新しいサイズ(20,20)に変更しないということです。ボタンをクリックすると、私のテストテキスト「Hello world」がコンソールに表示されます。

例のスクリーンショット:

代替リンクスクリーンショットが表示されていない場合:ここではhttp://www.dachaufsetzer.net/files/images/other/java-question-1.jpg

は私のコードです:

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); 


    } 

} 

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(); 

    }  
} 

ありがとうございます。あなたはまた、適切なサイズをリセットした後revalidate()を起動する必要がActionListenerコードで

答えて

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クラスです

あなたが同じ過ちを行っています。別のJDialogオブジェクトをDialogクラスコンストラクタに作成しています。もう1つの大きな間違いは、ボタンにアクションリスナーとして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クラスです。このパラメータは、変更するパネルです。自分のメインクラスで次に

​​

あなたがnewを使用して、クラスのインスタンスを作成するときに、このインスタンスが、同じタイプの他のインスタンスと異なっているその特性を有しています。あなたのコードでは、同じタイプのインスタンスを複数作成していて、そのうちの1つを変更すると、他のインスタンスが変更されると考えられます(実際には2つの別々のものであるとは実際は理解していないと思います)。

+0

Flood2dのご協力をいただきありがとうございます。今それは明らかです! – spiceflo

1

。これにより、レイアウトマネージャが呼び出されます。

また、の後にrepaint()を呼び出す必要があります。

もちろん、これはパネルのサイズのみを変更します。ダイアログのサイズは変わりません。ダイアログのサイズを変更する場合は、pack()を呼び出す必要があります。 ActionListenerのSwingUtilities.windowForComponent(...)を使用して、ダイアログへの参照を取得できます。

+0

Flood2dからのご意見、ご協力ありがとうございました。 – spiceflo

関連する問題