通过JButton更改JPanel大小

时间:2017-04-09 02:05:43

标签: java swing jpanel actionlistener

我有一个带JButton的JDialog(屏幕截图中右框)。当我单击JButton时,我想在另一个JFrame中更改JPanel的大小(截图中的左侧框)。

我的问题是,目前我的应用程序没有将JPanel的大小更改为新的大小(20,20),当我点击按钮"点击我"。我的测试文本" Hello world"单击按钮时出现在控制台中。

示例屏幕截图:

如果未显示屏幕截图,则为替代链接:http://www.dachaufsetzer.net/files/images/other/java-question-1.jpg

这是我的代码:

Dialog.java (JDialog)

Observable<[Object]> -> [Observable<Object>] -> Observable<[Object]>

Generator.java (在Frame.java中使用的JPanel)

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


    } 

}

Frame.java (使用Generator.java的JFrame)

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

}

Main.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);
    }

感谢您的支持。

2 个答案:

答案 0 :(得分:1)

ActionListener代码中,您还需要在重置首选大小后调用revalidate()。这将调用布局管理器。

您可能还需要在repaint()之后调用revalidate()

当然这只会改变面板尺寸。对话框大小将保持不变。如果要调整对话框,可能还需要在对话框中调用pack()。您可以使用ActionListener中的SwingUtilities.windowForComponent(...)来获取对话框的引用。

答案 1 :(得分:0)

你正在做一些没有意义的事情。

关于Frame班级:

Frame类中,您正在构造函数中创建另一个JFrame对象,使Frame类无用。您还需要保存添加到Frame ScrollPane的Generator面板的引用,以便从Dialog更改其大小。这是带有更改的Frame类:

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

关于Dialog班级:

你犯了同样的错误。您正在JDialog类构造函数中创建另一个Dialog对象。另一个重大错误是您正在为按钮添加new Generator()作为动作侦听器。要更改添加到Generator的{​​{1}}面板的大小,您需要获取该面板的引用并将其添加为ActionListener。这是带有更改的Frame类:

Dialog

如您所见,现在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

使用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); } } 创建类的实例时,此实例的属性与同类型的其他实例不同。在您的代码中,您创建了多个相同类型的实例,认为更改其中一个将改变另一个(我认为您实际上并不了解它们是两个独立的事物)。